gì là cách tốt nhất, sử dụng Bash, để đổi tên tập tin trong các hình thức:Làm thế nào để không số pad trong tên tập tin trong Bash?
(foo1, foo2, ..., foo1300, ..., fooN)
Với tên file zero-đệm:
(foo00001, foo00002, ..., foo01300, ..., fooN)
gì là cách tốt nhất, sử dụng Bash, để đổi tên tập tin trong các hình thức:Làm thế nào để không số pad trong tên tập tin trong Bash?
(foo1, foo2, ..., foo1300, ..., fooN)
Với tên file zero-đệm:
(foo00001, foo00002, ..., foo01300, ..., fooN)
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
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!
Đâ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
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
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
Đó 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*
Nó cũng xử lý tên tệp với không gian. – palacsint
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ụ:
%04d.${f#*.}
(giữ phần mở rộng tập tin gốc)photo_%04d.${f#*.}
(giữ phần mở rộng gốc)%04d.jpg
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
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