Batch đổi tên tập tin


151

Tôi có một thư mục đầy hình ảnh:

image0001.png
image0002.png
image0003.png
...

Và tôi muốn một lớp lót để đổi tên chúng thành (nói).

0001.png
0002.png
0003.png
...

Làm thế nào để tôi làm điều này?


8
Đây là một trong những Câu hỏi thường gặp về dòng lệnh Unix hàng đầu và tôi chưa thể tìm thấy nó trên trang web này, vậy chúng ta có nên tạo Cộng đồng Wiki này không?
Gilles

5
Tôi không hiểu tại sao. Đó là một câu hỏi cụ thể với một câu trả lời có thể kiểm chứng.
Người đàn ông Internet

3
Nếu bạn đang chạy X, nó sẽ không dễ dàng hơn nhiều so thunar -B *.pngvới công cụ gui đổi tên hàng loạt của thunar.
dotjoe

@dotjoe Cảm ơn, Thunar thực sự thú vị.
Volker Siegel

Câu trả lời:


106

Nếu bạn đang sử dụng Bash hoặc shell tương thích POSIX khác:

for f in *.png; do
    mv -- "$f" "${f#image}"
done

2
Đây là một trong những phương pháp thay thế tham số được hiển thị trong Mendel Coopers Hướng dẫn về kịch bản Bash nâng cao tldp.org/LDP/abs/html
W_Whalley

2
@W_Whalley tôi khuyên tránh dẫn đó, có lợi cho Wooledge Bash Hướng dẫn .
tự đại diện

@Wildcard: lý do của bạn để đề xuất tránh hướng dẫn ABS là gì?
Christian Severin

@ChristianSeverin quảng bá các thực hành xấu và mã bị hỏng hoàn toàn. Kiểm tra các liên kết trên trang hồ sơ của tôi.
tự đại diện

Nếu bạn không biết cách điều chỉnh ví dụ này cho các mẫu tệp khác nhau, bạn có thể muốn xem Phần mở rộng tham số của hướng dẫn được đề cập ở trên.
lex82

108

Trên Debian và các công cụ phái sinh, Perl renamehoạt động tương tự sednhư thế này:

  rename -v 's/image//' *.png

Ngoài ra còn có là renametừ util-linuxmà làm việc như thế này, thay vì:

  rename image '' *.png

6
bạn thực sự nên giải thích rằng đây là một chương trình perl có thể phải được cài đặt và nó lấy các biểu thức chính quy làm đối số.

Ah, tôi đã không nhận thức được điều đó. Tôi sẽ công nhận câu trả lời chính tắc, khi tôi xác định nó :)
Người đàn ông Internet

5
renameChương trình này đến từ một phân phối ví dụ Perl. Debian và Ubuntu gửi nó dưới dạng /usr/bin/rename. Các biến thể Unix khác có thể không cung cấp nó, hoặc có thể cung cấp một cách hoàn toàn khác /usr/bin/rename.
Gilles

1
Một số phiên bản renamelấy từ mẫu đến thay thế:rename [options] <expression> <replacement> <file>...
kết hợp

1
Nếu bạn đang sử dụng một hệ thống dựa trên Debian thì sudo apt-get install đổi tên, thì bạn có thể sử dụng lệnh đổi tên. Nó là sed cho tên tập tin.
ctrl-alt-delor

41

zmv

Shell zsh có một lệnh đổi tên hàng loạt mạnh mẽ được gọi zmv.

Trước tiên, bạn cần kích hoạt zmvlệnh như sau (điều này có thể đi vào của bạn ~/.zshrc).

autoload zmv

Cú pháp cơ bản là zmv PATTERN REPLACEMENT. Các mô hình là một biểu thức toàn cầu vỏ. Các phần của mẫu có thể được bao quanh bởi dấu ngoặc đơn. Văn bản thay thế có thể chứa $1, $2v.v. để chỉ nhóm ngoặc đơn Nth trong mẫu. Ví dụ:

zmv 'image(*.png)' '$1'

Bạn cũng có thể yêu cầu zsh để tự động xác định $1, $2vv để phù hợp với ký tự đại diện trong các mô hình:

zmv -w 'image*.png' '$1.png'

4
sweeeeeeeeeeeeeeeeeet. Một lý do khác tôi nên học zsh.
ixtmixilix

1
@ixtmixilix học gì? Chỉ cần bắt đầu sử dụng nó và có thể thêm prezto ( github.com/sorin-ionescu/prezto ) cho một số điều tuyệt vời.
Gerry

Thật tuyệt, như được chỉ ra trong người của zmv, điều này có thể được đơn giản hóa hơn nữa bằng cách thêm bí danh mmv = 'noglob zmv -W' vào: mmv * .c.orig orig / *. C
Bretsko

Việc zmvkích hoạt prezto yêu cầu bỏ ghi chú trong ~ / .zpreztorc của bạn sau khi # Set the Zsh functions to load (man zshcontrib).chozstyle ':prezto:load' zfunction 'zargs' 'zmv'

33

Tôi thường sử dụng tiện ích mmv ( trang man ) đẹp và đơn giản cho usecase này:

$ mmv "image*.png" "#1.png"

sẽ thực hiện nhiệm vụ của bạn.

Mẫu #1trong mục tiêu sẽ được thay thế bằng bất cứ thứ gì khớp với ký tự đại diện trong mẫu nguồn. Điều này cũng hoạt động đối với một số ký tự đại diện và ví dụ có thể được sử dụng để thay đổi thứ tự các phần của tên tệp. Bạn cũng có thể dễ dàng làm những việc phức tạp hơn như chuyển đổi chữ thường thành chữ in hoa.

Hãy chắc chắn để bảo vệ các mẫu từ vỏ bằng cách trích dẫn.


Cảm ơn đã chỉ ra tiện ích này. Tôi tìm thấy nó trong kho Debian, Ubuntu và Cygwin. Tôi gặp rắc rối với trang man, nhưng tìm thấy một số trang web và câu hỏi Stack Overflow này giúp giải thích cách bạn đang sử dụng nó. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley

Cảm ơn, tôi đã thêm một số thông tin vào câu trả lời để làm cho nó rõ ràng hơn.
Marcel Promotionberg

3
Không thể nâng cấp nó đủ! Thật đơn giản và thân thiện. Có sẵn cho OS X trong homebrew.
Greg Dubicki 17/03/2017

9

POSIX sh cho vòng lặp

Sử dụng sed để đổi tên

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done

6

Tôi thích Perl vì vậy:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Bạn cũng có thể sử dụng cùng một mẫu cho các tác vụ khác như sao chép các tệp vào thư mục khác:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'

2
Hoặc (an toàn hơn!):rename($old,$_)
rebierpost

5

qmv

Lệnh qmvtừ renameutilsmở trình soạn thảo hiển thị danh sách tên tệp có hai dấu hai chấm, cách nhau bằng một tab. Mỗi hàng hiển thị một trong các tên tệp, giống nhau ở cả hai cột. Cột bên phải đại diện cho tên mới của các tập tin.
Để thay đổi, chỉnh sửa tên ở phía bên phải. Trong ví dụ này, :%s/...hoặc chế độ khối trực quan là hữu ích.

Tên tệp trong trình chỉnh sửa của bạn

$ qmv *.png

Trong trình soạn thảo:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Chỉnh sửa tên trong cột bên phải:
(Xóa imagetiền tố khỏi tất cả các dòng bằng chế độ khối trực quan)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Nhật ký đổi tên:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(ví dụ: Ubuntu apt-get install renameutils:)


3

đệ quy

dễ dàng chọn lại các tệp hình ảnh * png và cho rằng không cần phải xử lý dòng mới trong tên tệp

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

An toàn, có thể xử lý các khoảng trắng, dòng mới, dấu gạch chéo ngược và bất cứ thứ gì khác :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done

1

POSIX sh sử dụng vòng lặp while

Đọc tên từ findlệnh.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Đọc tên từ một tập tin

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


1

Đối với Windows và linux , tập lệnh Perl này sẽ làm; trong trường hợp này:

$ rnm -l 's/^image//' '*.png'

Kịch bản có thể chạy đệ quy trong các thư mục và thậm chí trả trước một số lượng cho tất cả chúng:

$ rnm -r 's/^/$counter./' '/\.png$/'

Các ký tự UTF-8 cũng được xử lý chính xác, cả trong Windows và linux.


0

Bạn có thể sử dụng công cụ này: rnm ( trang web )

Đối với trường hợp của bạn, lệnh sẽ là:

rnm -rs '/^image//' *.png

Bạn có thể tìm thấy nhiều ví dụ / tài liệu ở đây .


0

Hãy thử brename ( https://github.com/shenwei356/brename ), một công cụ dòng lệnh đa nền tảng thực tế để đổi tên tập tin / thư mục hàng loạt một cách an toàn thông qua biểu thức thông thường (hỗ trợ Windows, Linux và OS X).

@patrickDurusau nói:

Linux có nhiều tùy chọn đổi tên tập tin hàng loạt nhưng tôi không thấy bất kỳ sự xuất hiện ngắn nào trong tên viết tắt của tôi.

Đặc trưng:

  • Đa nền tảng . Hỗ trợ Windows, Mac OS X và Linux.
  • An toàn . Bằng cách kiểm tra các xung đột và lỗi tiềm ẩn .
  • Lọc tệp . Hỗ trợ bao gồm và loại trừ các tập tin thông qua biểu thức thông thường. Không cần phải chạy lệnh như thế nào find ./ -name "*.html" -exec CMD.
  • Đổi tên mẫu con với giá trị tương ứng thông qua tệp khóa-giá trị .
  • Đổi tên thông qua số nguyên tăng dần .
  • Đệ quy đổi tên cả tập tin và thư mục .
  • Hỗ trợ chạy khô .
  • Đầu ra đầy màu sắc .

Chỉ huy:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed

-5

ls * png | trong khi đọc -rf; do f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; làm xong


Một cái gì đó không đúng: "mv: thiếu toán hạng tệp đích sau 'image0001.png'"
Internet man

3
Có nhiều vấn đề với mã của bạn. Phân tích đầu ra của lschỉ là gọi cho rắc rối. readnên read -r. tất cả các thay thế nên được trong dấu ngoặc kép.
Gilles

Bạn có thể viết điều này hiệu quả hơn như for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done. Phân tích cú pháp lslà không cần thiết cũng không phải là một ý tưởng tốt .
kojiro
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.