Đổi tên hàng trăm tệp cùng một lúc để sắp xếp hợp lý


23

Tôi có một tấn các tập tin, tất cả những thứ được đặt tên như 1.jpg, 2.jpg, 3.jpg, và vân vân lên đến 1439.jpg, tuy nhiên, tôi có một vấn đề với một trong những dự án và alphabetizing tôi. Nó thường sẽ đi theo thứ tự 1.jpg, 10.jpg, 11.jpgvà vân vân.

Những gì tôi cần là một số cách để đặt tên cho các tệp để chúng ở định dạng như 00001.jpgtất cả các cách 01439.jpg.

Làm thế nào tôi có thể làm điều này một cách nhanh chóng và hiệu quả?


Những gì bạn đang tìm kiếm là "sắp xếp tự nhiên", có thể điều này sẽ giúp: askubfox.com/questions/41390/ trên
Fabian Blechschmidt

Trả lời đó không phải là một câu trả lời trực tiếp? ls -v unix.stackexchange.com/questions/33909/ từ
WernerCD

+1 vì tôi đã cố gắng không thành công để làm điều này pyrenamer.
Parto

@FabianBlechschmidt, tôi cần điều này trong một chương trình không dành cho nautilus hoặc tương tự. Đó là cho một dự án cá nhân.
Kaz Wolfe

Tôi nghĩ rằng bạn nghĩ về việc thực hiện phân loại tự nhiên? Nhưng tôi hiểu, đổi tên tập tin khá dễ dàng và nếu nó thực hiện được công việc, thật tuyệt :)
Fabian Blechschmidt

Câu trả lời:


35

Ubuntu đi kèm với một kịch bản được gọi là rename. Đó chỉ là một tập lệnh Perl nhỏ có một số tính năng đổi tên hàng loạt mạnh mẽ nhưng tốt nhất (trong trường hợp này) là khả năng để nó chạy Perl trong quá trình thay thế. Kết quả là một giải pháp thực sự nhỏ gọn:

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

Điều này tương tự với các printfcâu trả lời kiểu khác ở đây nhưng tất cả đều được xử lý cho chúng tôi. Mã ở trên là cho một số có 5 chữ số (bao gồm một số không thay đổi hàng đầu).

Nó sẽ tìm kiếm và thay thế chuỗi số đầu tiên mà nó tìm thấy bằng một phiên bản không có đệm và để lại phần còn lại của tên tệp. Điều này có nghĩa là bạn không phải lo lắng quá nhiều về việc mang theo bất kỳ phần mở rộng hoặc tiền tố nào.

Lưu ý: đây không phải là hoàn toàn di động. Nhiều bản phân phối sử dụng rename.ultừ util-linuxgói làm renamenhị phân mặc định của chúng . Đây là một thay thế đóng thế đáng kể (xem man rename.ul) mà sẽ không hiểu những điều trên. Nếu bạn thích điều này trên nền tảng không sử dụng đổi tên của Perl, hãy tìm hiểu cách cài đặt trước.


Và đây là một khai thác thử nghiệm:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

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

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

Và một tiền tố mẫu (chúng tôi không làm gì khác):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3

Nếu tôi là một người Perl thì đây sẽ là giải pháp hoàn hảo. Thực sự gọn gàng.
MGP

2
Nó không sử dụng bất kỳ perl nào, chỉ là một công cụ được cung cấp đã được viết bằng perl.
Cướp

1
Trong trường hợp này nó không liên quan đến một lệnh Perl đơn nhưng nó không chính xác nâng nặng. sprintftrong Perl hành xử tương tự như sprintftrong các ngôn ngữ khác.
Oli

21
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Chỉnh sửa

Giải trình:

  • if [[ $f =~ [0-9]+\. ]] đảm bảo rằng chỉ các tệp có tên là số (theo sau là dấu chấm) mới được đổi tên.
  • printf "%.5d" NUMBER thêm các số 0 đứng đầu
  • "${f%.*}" cắt phần mở rộng (.jpg) và chỉ để lại số
  • .jpgsau khi backtick thứ hai thêm phần mở rộng tập tin một lần nữa.

Lưu ý rằng điều này sẽ chỉ hoạt động trên tên tệp là số. Các số 0 đứng đầu đệm bên trái cho các tệp không được đánh số sẽ yêu cầu định dạng khác nhau.

Nếu bạn muốn thử nghiệm hãy thử lệnh này:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg  ; fi ; done

Chỉnh sửa 2

Làm cho lệnh an toàn hơn bằng cách đảm bảo rằng chỉ các tên tệp là số đang được đổi tên. Lưu ý rằng mọi tệp có sẵn có tên như 00001.jpg sẽ bị ghi đè.


Tập lệnh lót này hoạt động 'hết hộp' trên Ubuntu và các bản phân phối Linux khác! Không cần cài đặt bất kỳ công cụ bổ sung nào sử dụng perl, python, v.v.
HEXcube

6

Bên dưới một kịch bản python.

Kịch bản thêm các số 0 đứng đầu lên đến số chữ số đã xác định. Nếu tên lớn hơn đó, tệp (tên) không được chạm tới.

Kết hợp các tiện ích mở rộng khác nhau trong một hành động đổi tên có thể thêm một số tiện lợi. Để thêm (các) tiện ích mở rộng, chỉ cần thêm chúng vào bộ dữ liệu extensions = (".jpg", ".jpeg", ".tiff").

Sao chép văn bản vào một tệp trống, lưu nó dưới dạng rename.py, nhập đường dẫn chính xác vào thư mục tệp ( sourcedir), số chữ số bạn muốn tên mới có ( number_ofdigits) và phần mở rộng tệp để đổi tên ( extensions)

Chạy nó bằng lệnh:

python3 /path/to/script/rename.py

Kịch bản:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

chỉnh sửa:

Dưới đây là một phiên bản cải tiến một chút. Nó tự động xác định tên dài nhất trong thư mục và thêm các số 0 đứng đầu cho đến độ dài của tên dài nhất.

thí dụ:

1.jpg
12.jpg
123.jpg

trở thành:

001.jpg
012.jpg
123.jpg

Không cần thiết lập số chữ số.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])

2

Có một tiện ích đổi tên được triển khai trong Perl giúp việc này trở nên rất dễ dàng:

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

Đối số đầu tiên là biểu thức Perl được ước tính cho mỗi tên tệp.


0

Có một GUI sẽ làm điều này được gọi là pyRenamer có thể được tìm thấy trong kho. Cài đặt, bắt đầu, chọn thư mục của bạn và chỉ cần đặt 'Mẫu tên tệp được đổi tên' thành '{num5}' trên tab 'Mẫu' và nhấp vào nút 'Đổi tên'. Bạn cũng có thể xem trước những gì sẽ xảy ra trước khi đổi tên.


Trong khi câu trả lời của bạn KHÔNG hoạt động, xin lưu ý rằng đây là một shell-scriptingphần, có nghĩa là tôi đang tìm kiếm một câu trả lời dòng lệnh. Ngoài ra, bạn có thể cung cấp chi tiết hơn về chương trình? Ví dụ, định dạng mẫu là {num5}gì?
Kaz Wolfe

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

Điều này thật thô thiển, vì nó không thực hiện việc đổi tên một cách thông minh, sẽ cần phải nghĩ ra một mẹo cho việc đó. Nhưng nó sẽ giúp bạn sắp xếp các công cụ.

Cập nhật: Vâng, bạn có một câu trả lời đầy đủ hơn.


2
nó đổi tên 1439.jpg thành 0001439.jpg.
Avinash Raj

Vâng, tôi biết, chỉ cần thêm các số 0 bổ sung mà vẫn hoạt động với loại này.
Swarnendu Biswas
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.