2009-06-22 44 views
13

Tôi đổi tên phần mở rộng tập tin rỗng bằng lệnh này:hàng loạt mở rộng tập tin đổi tên, bao gồm cả thư mục con

rename *. *.bla 

Tuy nhiên, tôi có một thư mục với hàng trăm thư mục con như vậy, và lệnh này đòi hỏi tôi phải tự tìm đến mỗi thư mục con và chạy nó.

Có lệnh nào mà tôi có thể chạy từ chỉ một thư mục cấp cao hơn sẽ bao gồm tất cả các tệp trong các thư mục con không?

+0

thuộc về serverfault –

+0

/tôi nghĩ nó thuộc về đây quá – jrharshath

Trả lời

2

Bạn có thể dễ dàng thực hiện việc này và nhiều thứ khác với mô-đun Perl File::Find.

#!perl 

use strict; 
use warnings; 
use File::Find; 

my $extension = 'bla'; 
my $directory = '/tmp/test'; 

print "Files renamed:\n"; 
find(\&wanted, $directory); 

sub wanted { 
    return if /\./; 
    return unless -f $File::Find::name; 

    if (rename($File::Find::name, "$File::Find::name.$extension")) { 
     print " $File::Find::name -> $File::Find::name.$extension\n"; 
    } 
    else { 
     print " Error: $! - $File::Find::name\n"; 
    } 
} 
2

điều này sẽ cho phép bạn nhập dir bằng dấu cách trong tên. (Chú ý% đôi là cho các tập tin batch, sử dụng một% duy nhất cho dòng lệnh.)

for /f "tokens=* delims= " %%a in ('dir /b /ad /s') do rename "%%a\*." "*.bla" 
+0

Giving tôi không nhận ra là lỗi lệnh nội bộ hay bên ngoài . Sử dụng một% cho thử nghiệm dòng lệnh. Có vẻ khá gần gũi, nhưng nó chỉ là không hoàn toàn làm điều đó. – Alan

+0

bạn đang sử dụng một% cho cả vòng lặp for và đổi tên? – akf

+0

Chính xác. Bất kỳ may mắn về kết thúc của bạn? – Alan

0

Hãy thử điều này

for /R c:\temp %I in (*.) DO Echo rename %I "%~nI.bla" 
1

Bạn có thể sử dụng for để lặp qua các thư mục con:

for /d %x in (*) do pushd %x & ren *. *.bla & popd 

Khi sử dụng nó từ một tập tin thực thi, bạn sẽ cần phải tăng gấp đôi các dấu hiệu %:

for /d %%x in (*) do pushd %%x & ren *. *.bla & popd 
+0

điều này sẽ bắt đầu trong thư mục hiện tại nếu được phát hành từ dòng lệnh? (chỉ không muốn vô tình tràn vào phần còn lại của ổ đĩa) – Alan

+0

Có. Nếu bạn cần nó trong một thư mục cố định, bạn có thể thay đổi ký tự đại diện trong dấu ngoặc đơn thành cái gì đó giống như cho/d% x trong (% userprofile% \ foo \ *) làm ... – Joey

7
for /r c:\path\ %G in (*.) do ren "%G" *.bla 
0

Sử dụng tìm và xargs và basename sẽ làm cho sự biểu hiện dễ dàng hơn để đọc

Chuẩn bị một kịch bản đổi tên vỏ như thế này (điều chỉnh để xử lý nhiều file)

#!/bin/sh 
if [ $# -lt 3 ] 
then 
    echo "usage: rename.sh sufold sufnew file1 (file2 file3 ...) " 
    exit 
fi 

sufold=$1 
sufnew=$2 
shift 
shift 

for f in $* 
do 
    echo "to mv " $f `dirname $f`"/"`basename $f $sufold`$sufnew 
    mv $f `dirname $f`"/"`basename $f $sufold`$sufnew 
done 

Sau đó, bạn có thể gọi cho từng tệp khớp d tiêu chí của bạn, bao gồm tìm kiếm thư mục đệ quy bằng cách tìm lệnh

find . -name "*." | xargs rename.sh "." ".bla" 

Một mẫu phổ biến hơn

find . -name "*.htm" | xargs rename.sh ".htm" ".html" 
Các vấn đề liên quan