it-swarm-vi.com

Batch đổi tên tập tin

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?

157
Internet man

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
110
W_Whalley

Trên Debian và các dẫn xuất, rename của Perl hoạt động tương tự như sed như thế này:

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

Ngoài ra còn có rename từ util-linux hoạt động như thế này, thay vào đó:

  rename image '' *.png
113
Internet man

zmv

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

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

autoload zmv

Cú pháp cơ bản là zmv PATTERN REPLACEMENT. Mẫu này là một biểu thức toàn cầu Shell. 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, $2, V.v. để chỉ nhóm được ngoặc đơn thứ N 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, $2, V.v để khớp với các ký tự đại diện trong mẫu:

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

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

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

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

Các #1 trong mẫu đích 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.

Đảm bảo bảo vệ các mẫu khỏi Shell bằng cách trích dẫn.

34
Marcel Stimberg

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
10
X Tian

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 $_)'
6
gvkv

qmv

Lệnh qmv from renameutils mở 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.
[.__.] Để thực hiện thay đổi, hãy 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 tiền tố image 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)

6
Volker Siegel

đệ quy

dễ dàng chọn lại các tệp hình ảnh * png và giả sử 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
3
X Tian

Sử dụng Mở rộng nẹp Shell :

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

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 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 ).

@ patrickDurusa đã 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ởi 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 các lệnh như 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 .
  • Đổi tên đệ quy cả tệp 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
1
Wei Shen

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

Đọc tên từ find lệ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
X Tian

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

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

Tập lệnh 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.

1
circulosmeos

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êm ví dụ/tài liệu tại đây .

0
Jahid