Làm cách nào để đổi tên nhiều tệp bằng cách thay thế từ trong tên tệp?


36

Thay thế ACDC thành AC-DC

Ví dụ: chúng tôi có những tập tin này

ACDC - Rock N 'Roll Không gây ô nhiễm tiếng ồn.xxx

ACDC - Rocker.xxx

ACDC - Bắn vào Thrill.xxx

Tôi muốn họ trở thành:

AC-DC - Rock N 'Roll Không gây ô nhiễm tiếng ồn.xxx

AC-DC - Rocker.xxx

AC-DC - Bắn vào Thrill.xxx

Tôi biết rằng sed hoặc awk được sử dụng cho hoạt động này. Tôi không thể google bất cứ điều gì vì vậy tôi đang yêu cầu sự giúp đỡ của bạn =) Bạn có thể vui lòng cung cấp lệnh shell hoạt động đầy đủ cho tác vụ này không?

Phản hồi: Giải pháp cho người dùng OSX


1
Tôi cảm thấy có một câu hỏi lớn hơn ở đây - bạn đang cố gắng sửa chữa tên tập tin mp3 nói chung? Có một số kịch bản mọi người đã viết trong nhiều năm để làm điều này. Tôi nghĩ rằng một trong những tôi đã sử dụng đã được gọi mp3fixer.
Phil Hollenback

không, đó không phải là về mp3. Tôi chỉ phải quản lý một số tệp lớn có tên tương tự, và mọi thứ phải được thay thế hoặc sửa chữa ... tình huống phổ biến vì vậy tôi cần giải pháp tiện lợi này để đổi tên tất cả chúng
holms

Câu trả lời:


45
rename 's/ACDC/AC-DC/' *.xxx

từ man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Ví dụ: để đổi tên tất cả các tệp khớp với "* .bak" để loại bỏ phần mở rộng, bạn có thể nói

rename 's/\.bak$//' *.bak

Để dịch tên viết hoa thành thấp hơn, bạn sẽ sử dụng

rename 'y/A-Z/a-z/' *

5
Lưu ý rằng nhiều máy linux đi kèm với việc đổi tên từ linux-linux, thực hiện thay thế đơn giản, không phải là biểu thức chính quy . Vì vậy, nếu đổi tên thất bại trong âm thầm mà không làm gì, có lẽ bạn đang sử dụng sai rename.
Phil Hollenback

Tôi đã tìm kiếm điều này từ lâu! thnx!
thánh

@PhilHollenback Làm thế nào để tìm / cài đặt đúng? :)
henry

Nó không hoạt động khi tôi có dấu gạch dưới trong tên tệp của mình thay vì khoảng trắng - làm cách nào tôi có thể giải quyết điều đó?
unfa

13

Câu trả lời này chứa các phần tốt từ tất cả các câu trả lời khác, trong khi bỏ qua những dị giáo như ls | while read.

Thư mục hiện tại:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Bao gồm các thư mục con:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Các ký tự dòng mới thực sự không có trong tên tệp, vì vậy điều này có thể đơn giản hơn trong khi vẫn hoạt động với các tên chứa khoảng trắng:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

9

Để sử dụng phiên bản linux-linux renamemà Phil đã đề cập (trên Ubuntu, nó được gọi là rename.ul):

rename ACDC AC-DC ACDC*

hoặc là

rename.ul ACDC AC-DC ACDC*

1
biến thể của bạn là tốt nhất =) rất nhiều bài viết ngu ngốc trong google về tìm và gửi và awk ... cho hoạt động đơn giản này mà renameutils egxist đã có!
thánh

4

Sử dụng bash shell

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Lưu ý: việc sử dụng findsẽ xử lý thư mục hiện tại và các thư mục bên dưới.


1

Phụ thuộc vào vỏ của bạn. Trong zsh, tôi sẽ làm điều này:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Có lẽ không phải là giải pháp tốt nhất, nhưng hoạt động.


1

Sử dụng bash:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Nếu bạn đã renamecài đặt chương trình:

rename 's/ACDC/AC-DC/' *.xxx
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.