2008-09-11 34 views

Trả lời

25

Trong trường hợp N không phải là cố định tiên nghiệm:

for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done 
2

Sau đây sẽ làm điều đó:

for i in ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done 

EDIT: thay đổi để sử dụng ((i = 1, ...)), cảm ơn mweerden!

+0

Thay vì sử dụng seq tôi sẽ đề nghị bằng văn bản cho ((i = 1; i <= N; i ++)); làm vvBên cạnh đó là một phần của bash, điều này cũng tránh phải đầu tiên tạo ra tất cả các số và sau đó thực hiện cho. – mweerden

0

Đây là giải pháp nhanh chóng giả định tiền tố có độ dài cố định ("foo") của bạn và độ dài cố định. Nếu bạn cần sự linh hoạt hơn, có lẽ điều này ít nhất sẽ là một điểm khởi đầu hữu ích.

#!/bin/bash 

# some test data 
files="foo1 
foo2 
foo100 
foo200 
foo9999" 

for f in $files; do 
    prefix=`echo "$f" | cut -c 1-3`  # chars 1-3 = "foo" 
    number=`echo "$f" | cut -c 4-`   # chars 4-end = the number 
    printf "%s%04d\n" "$prefix" "$number" 
done 
4

Bash tinh khiết, không có quy trình bên ngoài khác hơn 'mv':

for file in foo*; do 
    newnumber='00000'${file#foo}  # get number, pack with zeros 
    newnumber=${newnumber:(-5)}  # the last five characters 
    mv $file foo$newnumber   # rename 
done 
13

Tôi đã có một trường hợp phức tạp hơn, nơi tên tệp có một postfix cũng như tiền tố, và tôi cũng cần thực hiện phép trừ trên số từ tên tệp. Vì vậy, tôi muốn foo56.png trở thành foo00000055.png. Tôi hy vọng điều này sẽ giúp ích nếu bạn đang làm điều gì đó phức tạp hơn.

#!/bin/bash 
for file in foo[0-9]*.png; do 
    # strip the prefix ("foo") off the file name 
    postfile=${file#foo} 
    # strip the postfix (".png") off the file name 
    number=${postfile%.png} 
    # subtract 1 from the resulting number 
    i=$((number-1)) 
    # copy to a new name in a new folder 
    cp ${file} ../newframes/$(printf foo%08d.png $i) 
done 
44

Đó không phải là tinh khiết bash, nhưng dễ dàng hơn nhiều với rename lệnh:

rename 's/\d+/sprintf("%05d",$&)/e' foo* 
+0

Nó cũng xử lý tên tệp với không gian. – palacsint

1

Lệnh oneline mà tôi sử dụng là:

ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done 

PATTERN có thể ví dụ:

  • đổi tên bằng gia số ment truy cập: %04d.${f#*.} (giữ phần mở rộng tập tin gốc)
  • đổi tên với truy cập tăng với tiền tố: photo_%04d.${f#*.} (giữ phần mở rộng gốc)
  • đổi tên với truy cập tăng và mở rộng thay đổi jpg: %04d.jpg
  • đổi tên với truy cập tăng với tiền tố và tập tin basename: photo_$(basename $f .${f#*.})_%04d.${f#*.}
  • ...

Bạn có thể lọc các tập tin để đổi tên với ví dụ ls *.jpg | ...

Bạn có sẵn biến số f là tên tệp và i là bộ đếm.

Đối với câu hỏi của bạn đúng lệnh là:

ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done 
Các vấn đề liên quan