Làm cách nào để dễ dàng đổi tên nhiều tệp bằng dòng lệnh?


103

Một trong những cách tôi nhanh chóng đổi tên các tệp trong Windows là

F2 > Rename > Tab (to next file) > Rename ...

Nhưng trong Ubuntu / Nautilus, tôi không thể chuyển sang tệp tiếp theo. Nhưng trên Linux, tôi nghĩ phải có một dòng lệnh thay thế.

Tuy nhiên, đôi khi, tôi có thể muốn kiểm soát nhiều hơn về cách đổi tên các tệp cụ thể. Trong trường hợp đó, có lẽ tốt hơn để có thể chuyển sang tệp tiếp theo


1
Bạn có thể định nghĩa "kiểm soát nhiều hơn"? Không chắc chắn những gì bạn đang hỏi chính xác ..
Dang Khoa

Tôi nghĩ rằng câu hỏi này không được trả lời. Những gì bạn đang yêu cầu (F2 và sau đó nhảy ở chế độ F2 sang tệp tiếp theo) hiện không có sẵn tôi nghĩ trong Nautilus.
don.joey 16/07/13

Câu trả lời:


188

Tôi sử dụng renametất cả thời gian. Nó khá đơn giản, nhưng hy vọng bạn biết regex cơ bản:

rename "s/SEARCH/REPLACE/g"  *

Điều này sẽ thay thế chuỗi SEARCHvới REPLACEtrong mỗi tệp (có nghĩa là, *). Có /gnghĩa là toàn cầu, vì vậy nếu bạn có một SEARCH_SEARCH.jpg, nó sẽ được đổi tên REPLACE_REPLACE.jpg. Nếu bạn không có /g, nó sẽ chỉ thực hiện thay thế một lần, và do đó bây giờ được đặt tên REPLACE_SEARCH.jpg. Nếu bạn muốn không phân biệt chữ hoa chữ thường, hãy thêm /i(đó sẽ là /gihoặc /igở cuối).

Với các biểu thức thông thường, bạn có thể làm nhiều hơn nữa.

Lưu ý rằng đây renamelà lệnh prename(còn gọi là Perl rename), hỗ trợ các biểu thức chính quy Perl hoàn chỉnh. Có một renamecái khác sử dụng các mẫu và không mạnh bằng. prenametừng được cài đặt theo mặc định trên Ubuntu (cùng với Perl), nhưng bây giờ bạn có thể phải làm:

sudo apt install rename

Đây là vài ví dụ:

Tiếp đầu ngữ

Thêm :

rename 's/^/MyPrefix_/' * 
  • document.pdf đổi tên thành MyPrefix_document.pdf

Xóa :

Ngoài ra, bạn có thể loại bỏ các chuỗi không mong muốn. Giả sử bạn có 20 tệp MP3 có tên như thế CD RIP 01 Song.mp3và bạn muốn xóa phần "CD RIP" và bạn muốn xóa tệp đó khỏi tất cả chúng bằng một lệnh.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 đến 01 Song.mp3

Lưu ý không gian thừa trong '^CD RIP ', không có không gian, tất cả các tệp sẽ có khoảng trắng là ký tự đầu tiên của tệp. Cũng lưu ý, điều này sẽ hoạt động mà không có ^ký tự, nhưng sẽ khớp với CD RIP bất kỳ phần nào của tên tệp. Các ^đảm bảo nó chỉ loại bỏ các ký tự nếu chúng là phần đầu của tệp.

Hậu tố

Thêm :

rename 's/$/_MySuffix/' *
  • document.pdf đổi tên thành document.pdf_MySuffix

Thay đổi :

rename 's/\.pdf$/.doc/' *

sẽ đổi Something.pdfthành Something.doc. (Lý do của dấu gạch chéo ngược là, .là một ký tự đại diện trong regrec vì vậy .pdfkhớp qPDFtrong khi \.pdfchỉ khớp với chuỗi chính xác .pdf. Cũng rất quan trọng cần lưu ý, nếu bạn không quen với BASH, bạn phải đặt dấu gạch chéo ngược trong dấu ngoặc kép SINGLE! hoặc sử dụng dấu ngoặc kép hoặc bash sẽ cố gắng dịch chúng. Để bash \. "\." bằng .. (Nhưng dấu ngoặc kép và dấu gạch chéo ngược được sử dụng, ví dụ "\ n" cho một dòng mới, nhưng vì đó "\."không phải là một chuỗi thoát ngược hợp lệ, nên nó dịch sang .)

Trên thực tế, bạn thậm chí có thể đặt các phần của chuỗi trong dấu ngoặc kép thay vì toàn bộ: 's/Search/Replace/g'giống như s/'Search'/'Replace'/gs/Search/Replace/gvới BASH. Bạn chỉ cần cẩn thận về các ký tự đặc biệt (và khoảng trắng).


Tôi đề nghị sử dụng -ntùy chọn khi bạn không tích cực, bạn có các biểu thức chính quy chính xác. Nó cho thấy những gì sẽ được đổi tên, sau đó thoát ra mà không làm điều đó. Ví dụ:

rename -n s/'One'/'Two'/g *

Điều này sẽ liệt kê tất cả các thay đổi mà nó đã thực hiện, nếu bạn không đặt -ncờ ở đó. Nếu nó trông ổn, nhấn Upđể quay lại, sau đó xóa -nvà nhấn Enter(hoặc thay thế nó -vđể xuất ra tất cả các thay đổi mà nó thực hiện).

Lưu ý : Các phiên bản Ubuntu trên 17.04 không được gửi kèm renametheo mặc định, tuy nhiên nó vẫn có sẵn trong kho. Sử dụng sudo apt install renameđể cài đặt nó


Làm thế nào tôi sẽ có một hậu tố "năng động". Giống như 001 - 010, vv Có thể?
Jiew Meng

Hmm .. Tôi đã cố gắng viết một cái gì đó lên nhưng nó không hoạt động. Chủ yếu là bởi vì, khi tôi thêm 1 đến 001, nó thêm vào 2, chứ không phải 002. Nếu không, tôi chỉ có thể sử dụng các biến để giữ vị trí số, sau đó nối nó. Ngoài ra, tôi chỉ nhớ, trước khi tôi biết về người đi làm rename, đây là những gì tôi đã làm để nối thêm:for f in *; do mv -v "$f" "prependThis$f"; done
Matt

2
@jiewmeng Vâng. Sử dụng (?:\.[0-9]{3})$trong mẫu của bạn, nó sẽ khớp với tất cả các phần mở rộng tệp 3 chữ số trong một nhóm thụ động. Ví dụ : rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Có một cái nhìn vào bảng cheat regex này .
sergio91pt

@ sergio91pt nó là một mánh gian lận regex đẹp. Nhưng nó là về cái gì? Phải là perl - nhưng không thể tìm thấy một ghi chú như vậy ở đó.
Adobe

@Adobe Đây là một cái chung cho "perl dựa trên regex". Nhìn vào ghi chú về dấu + và cột về Lớp ký tự POSIX.
sergio91pt

21

Hãy thử pyrenamer .

Nó không được tích hợp với nautilus, nhưng nó hoàn thành công việc. Đây là một đánh giá.

Thunar (một phần của XFCE) cũng có một renamer mà bạn có thể chạy riêng.

Renarer số lượng lớn


2
cảm ơn vì đã đề cập đến chức năng Thunar. Nếu bạn có Thunar - chọn tệp trong thư mục và nhấn F2.
Tối đa

9

Dường như có một dự án trên launchpad được gọi là nautilus-renamer . Bạn có thể cài đặt nó bằng cách chạy make installkhi bạn tải xuống tập lệnh và gỡ nó ra. Nó dường như có một số chức năng hoặc nếu bạn biết một số chương trình có thể là bạn chỉ có thể nâng cao nó theo nhu cầu của bạn vì nó chỉ là một kịch bản python.

nhập mô tả hình ảnh ở đây


8

Trong dòng lệnh, để đổi tên một tệp, lệnh chỉ đơn giản là

mv file1.txt file2.txt

Nếu bạn muốn thực hiện theo đợt, có lẽ bạn sẽ muốn thực hiện thông qua một tập lệnh. Nếu bạn cung cấp thêm thông tin chi tiết, tôi hoặc người khác có thể đánh đòn cho bạn. Điều đó nói rằng, một tập lệnh để nối các thứ vào một tệp có thể trông như thế này:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

Tùy thuộc vào chính xác cách bạn cần những thứ được đổi tên, điều này có thể sẽ được điều chỉnh, ví dụ nếu bạn có các quy tắc đổi tên cụ thể để tuân theo. (Cá nhân tôi sẽ thực hiện điều này thông qua tập lệnh Perl vì bash-foo của tôi không tuyệt lắm, nhưng đó chỉ là tôi.)

Lưu ý rằng tôi đã tách tên tệp và phần mở rộng từ một câu hỏi đã hỏi trước đó .


7

Trong trường hợp bạn muốn làm điều đó mà không cần dòng lệnh, tương tự như những gì bạn đã làm trong Windows, hãy sử dụng phím mũi tên phải thay vì phím tab . Điều này sẽ chọn tệp tiếp theo giống như tab trong Windows.


Nó không giống nhau: bạn vẫn sẽ cần ENTER để hoàn thành việc đổi tên, phím mũi tên để chuyển sang tệp tiếp theo và F2 để đổi tên nó. TAB thực hiện trong 1 bước khi bạn đổi tên tệp.
MestreLion

@MestreLion Nhưng nó rất giống với thuật toán được mô tả trong câu hỏi và không yêu cầu bất kỳ phần mềm bổ sung cũng như các thao tác dòng lệnh nào. Sắp xếp thân thiện với người dùng.
Rafał Cieślak

Đúng, bạn là câu trả lời duy nhất mà ít nhất đã thử cách tiếp cận giống như câu hỏi ban đầu. Và sự thật đáng buồn là Nautilus không có chức năng như vậy. Bạn có thể F2 để đổi tên, nhưng đó là nó. Không có TAB để tự động chuyển bạn sang tệp tiếp theo trong chế độ đổi tên.
MestreLion

7

Không thực sự giống như câu hỏi Làm thế nào có thể đổi tên nhiều tệp cùng một lúc? nhưng tôi sẽ đề xuất cùng một chương trình mà tôi đề xuất trong câu trả lời đó: qmv .

qmv là một công cụ tiện dụng từ gói renameutils. Nó cho phép bạn sử dụng trình soạn thảo văn bản yêu thích của mình để đổi tên tập tin. Kết hợp với sức mạnh của vim, bạn có một tiện ích đổi tên tuyệt vời.

Tôi thường gọi nó như qmv -f dotrong thư mục mà tôi muốn đổi tên một loạt các tập tin. Hoặc nếu tôi muốn đổi tên đệ quy qmv -R -f do.

Bất cứ khi nào tôi có nhu cầu đổi tên nhiều tập tin, tôi luôn rơi vào qmv (và vim).

http://www.nongnu.org/renameutils/


Tôi chỉ thử điều này dựa trên đề nghị của bạn. Đây thực sự là công cụ tuyệt vời nhất nếu bạn sử dụng vim!
ste_kwr

3

Nếu tùy chọn phù hợp duy nhất là đổi tên các tệp theo cách thủ công, một cách tuyệt vời để làm điều đó là sử dụng vidir(trong moreutilsgói):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Ví dụ


Đổi tên tập tin một cách chọn lọc

Nội dung của thư mục làm việc hiện tại:

.
├── bar
├── baz
└── foo

Chạy vidir, đổi tên tên tệp trong các dòng chứa tên tệp bạn muốn đổi tên; nhấn CTRL+ OCTRL+ X:

ảnh chụp màn hình3

.
├── bar.bak
├── baz.old
└── foo.new

Chuyển đổi tên tập tin một cách chọn lọc

Nội dung của thư mục làm việc hiện tại:

.
├── bar
├── baz
└── foo

Nội dung tập tin của thư mục làm việc hiện tại:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Chạy vidir, chuyển số trong các dòng chứa tên tệp bạn muốn chuyển; nhấn CTRL+ OCTRL+ X:

ảnh chụp màn hình4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Xóa tệp có chọn lọc

Nội dung của thư mục làm việc hiện tại:

.
├── bar
├── baz
└── foo

Chạy vidir, xóa các dòng chứa các tệp bạn muốn xóa; nhấn CTRL+ OCTRL+ X:

ảnh chụp màn hình2

.
└── baz

2

Tôi đang sử dụng krename. Nó là một ứng dụng GUI. Nó có thể đọc các thẻ mp3 và như vậy.

Nó tồn tại như một ứng dụng riêng biệt cũng như một phần của Krusader.

Ngoài ra còn có một renametập lệnh - là một phần của cài đặt perl tiêu chuẩn (Bạn có thể đã cài đặt nó). Kiểm tra nó với man rename.

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.