Đổi tên tập tin để thêm số không hàng đầu vào số


9

Tôi đã thử một loạt các ví dụ về lệnh đổi tên nhưng tôi không thể tìm ra cú pháp để làm những gì tôi muốn.

Tôi có một loạt các tập tin được dán nhãn như

File_Ex_1.jpg
File_Ex_2.jpg
File_Ex_3.jpg
File_Ex_4.jpg
...
File_Ex_10.jpg
File_Ex_11.jpg
etc. 

Tôi muốn chỉ thay đổi một số trong số chúng bằng cách chèn một 0để tên tệp có cùng số ký tự.

Vì vậy, tôi muốn File_Ex_1.jpgđi đến File_Ex_01.jpg, File_Ex_2.jpgđểFile_Ex_02.jpg

Làm thế nào để bạn làm điều này với lệnh đổi tên?

Đây renamelệnh đã được cài đặt thông qua home-brew trên máy Mac. Đầu ra của rename -v:

rename -v
Usage:
    rename [switches|transforms] [files]

    Switches:

    -0/--null (when reading from STDIN)
    -f/--force or -i/--interactive (proceed or prompt when overwriting)
Wide character in print at /System/Library/Perl/5.18/Pod/Text.pm line 286.

    -g/--glob (expand "*" etc. in filenames, useful in Windows™ CMD.EXE)
    -k/--backwards/--reverse-order
    -l/--symlink or -L/--hardlink
    -M/--use=*Module*
    -n/--just-print/--dry-run
    -N/--counter-format
    -p/--mkpath/--make-dirs
    --stdin/--no-stdin
    -t/--sort-time
    -T/--transcode=*encoding*
    -v/--verbose

    Transforms, applied sequentially:

    -a/--append=*str*
    -A/--prepend=*str*
    -c/--lower-case
    -C/--upper-case
    -d/--delete=*str*
    -D/--delete-all=*str*
    -e/--expr=*code*
    -P/--pipe=*cmd*
    -s/--subst *from* *to*
    -S/--subst-all *from* *to*
    -x/--remove-extension
    -X/--keep-extension
    -z/--sanitize
    --camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)

Câu trả lời:


16

Hãy thử với điều này:

rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg

Thí dụ:

$ ls
Device_Ex_10.jpg  Device_Ex_1.jpg  Device_Ex_4.jpg  Device_Ex_7.jpg
Device_Ex_11.jpg  Device_Ex_2.jpg  Device_Ex_5.jpg  Device_Ex_8.jpg
Device_Ex_12.jpg  Device_Ex_3.jpg  Device_Ex_6.jpg  Device_Ex_9.jpg
$ rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
$ ls
Device_Ex_01.jpg  Device_Ex_04.jpg  Device_Ex_07.jpg  Device_Ex_10.jpg
Device_Ex_02.jpg  Device_Ex_05.jpg  Device_Ex_08.jpg  Device_Ex_11.jpg
Device_Ex_03.jpg  Device_Ex_06.jpg  Device_Ex_09.jpg  Device_Ex_12.jpg

Tôi lấy tham chiếu từ đây: /programming/5417979/batch-rename-fterential-files-by-padding-with-zeroes

Ở đây thích nghi với renameviệc thực hiện cụ thể của bạn .


Điều này trông giống như một cuộc gọi thích hợp cho phiên bản đổi tên dựa trên Perl, mà người hỏi dường như không có.
dhag

1
Có một tài liệu tham khảo tốt để giải thích ý nghĩa của các lệnh này? Giống như những gì dấu + làm. Điều này rất gần, ngoại trừ tôi đoán định dạng thực cho tên tệp của tôi là Device1_Ex_1.jpg Trường hợp cú pháp này sẽ biến nó thành Device01_Ex_1.jpg chứ không phải Device1_Ex_01.jpg
toombzie

1
@dhag Người hỏi chắc chắn có phiên bản dựa trên Perl, vì cả hai đều không chạy Linux nên họ không có linux-linux renamevà vì đầu ra của rename -vPerl đề cập rõ ràng.
Gilles 'SO- ngừng trở nên xấu xa'

1
Vâng, OK, từ ngữ của tôi là khủng khiếp. Tôi nên nói "phiên bản chấp nhận biểu thức Perl là một trong các tham số của nó". Đây vẫn giống như một câu trả lời sai phải không?
dhag

Thật thú vị, trong khi điều này dường như mâu thuẫn với văn bản trợ giúp, nếu tôi hiểu chính xác, yêu cầu -etrước mã Perl, cuộc gọi này thực sự hoạt động với tiện ích đổi tên đi kèm với macOS. Tôi rút lại nhận xét ban đầu của mình.
dhag

2

Với phiên bản đổi tên mà bạn dường như đang sử dụng, biểu thức sau sẽ thực hiện chuyển đổi bạn yêu cầu (kiểm tra với một thư mục chứa các tệp có tên File_Ex_{1..11}.jpg):

$ rename -n -e 's/_(\d\.)/_0$1/g' -- *.jpg
'File_Ex_1.jpg' would be renamed to 'File_Ex_01.jpg'
'File_Ex_2.jpg' would be renamed to 'File_Ex_02.jpg'
'File_Ex_3.jpg' would be renamed to 'File_Ex_03.jpg'
'File_Ex_4.jpg' would be renamed to 'File_Ex_04.jpg'
'File_Ex_5.jpg' would be renamed to 'File_Ex_05.jpg'
'File_Ex_6.jpg' would be renamed to 'File_Ex_06.jpg'
'File_Ex_7.jpg' would be renamed to 'File_Ex_07.jpg'
'File_Ex_8.jpg' would be renamed to 'File_Ex_08.jpg'
'File_Ex_9.jpg' would be renamed to 'File_Ex_09.jpg'

(Xóa cờ -nđể thực sự đổi tên.)

Đối số -elà biểu thức tìm kiếm và thay thế Perl; trong đó _(\d\.)khớp với dấu gạch dưới theo sau bởi một chữ số và sau đó là dấu chấm và thay thế dấu gạch dưới bằng _0, do đó chèn một số 0 đứng đầu. $1là một tham chiếu ngược đến nhóm trong ngoặc đơn, chữ số và dấu chấm và để nó không thay đổi trong tên tệp mới.


1

Trong khi nó có thể được thực hiện bằng prenamelệnh, tôi muốn cung cấp một thay thế python cho điều đó:

$ ls
File_Ex_1.jpg  File_Ex_2.jpg  File_Ex_3.jpg  File_Ex_4.jpg

$ ./pad_zeros.py *                                                                                                       

$ ls
File_Ex_01.jpg  File_Ex_02.jpg  File_Ex_03.jpg  File_Ex_04.jpg  pad_zeros.py*

Các pad_zeros.pykịch bản rất đơn giản:

#!/usr/bin/env python
import sys,os,re

for file in sys.argv[1:]:
    if __file__ in file: continue
    words = re.split('_|\.',file)
    words[-2] = words[-2].zfill(2)
    new_name = "_".join(words[:-1]) + "." + words[-1]
    os.rename(file,new_name)

Nó nhận các đối số trên dòng lệnh, lặp lại chúng và đệm các số không bằng cách sử dụng .zfill()lệnh (trong trường hợp cụ thể này là hai ký tự). Vì chúng tôi đang hoạt động trên tất cả các tệp trong cùng một thư mục, ngôi sao toàn cầu có thể được sử dụng.


Đây là câu trả lời tốt nhất có thể điều chỉnh theo tuy nhiên nhiều tệp cần được đổi tên.
mLstudent33

Mặc dù tôi đang gặp Anomalous backslash in string: '\g'. String constant might be missing an r prefix. (anomalous-backslash-in-string)lỗi
mLstudent33

không thể chạy nó vì vậy tôi chmod 755là nó. và bây giờ nhận được một lỗi thuyền: import-im6.q16: not authorized sys '@ error / const const.c / WriteImage / 1037. nhập-im6.q16: không được ủy quyền os' @ error/constitute.c/WriteImage/1037. import-im6.q16: not authorized lại '@ error / const const.c / WriteImage / 1037. ./renameLeadZero.py: dòng 6: lỗi cú pháp gần mã thông báo không mong muốn if' ./renameLeadZero.py: line 6: nếu tệp trong tệp: continue '`Tôi đang sử dụng một conda env vì vậy có lẽ phải chỉ định trình thông dịch trên shebang khác nhau?
mLstudent33

1
@ mLstudent33 Điều đó thật đặc biệt. Lỗi trong nhận xét thứ hai của bạn có thể xuất phát từ dấu gạch chéo ngược ở một trong các tên tệp. Regex Python nghĩ rằng đó là một lối thoát dấu gạch chéo đặc biệt. Có lẽ chúng ta có thể khắc phục điều đó bằng cách thêm repr()xung quanh filetheo re.split()dòng hoặc định dạng chuỗi ( stackoverflow.com/q/18707338/3701431 ) nhưng chúng ta sẽ cần tính đến việc đó là Python3 hay Python2.7 trên hệ thống - chuỗi của họ định dạng là khác nhau chỉ một chút. Đối với lỗi trong bình luận thứ ba, tôi không thể xác nhận cũng không phủ nhận - không bao giờ làm việc với Conda.
Sergiy Kolodyazhnyy

Cảm ơn vi đa trả lơi.
mLstudent33
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.