Làm thế nào để thay thế một char bằng một char khác trong tất cả tên tệp của các thư mục hiện tại?


41

Làm thế nào để bạn đổi tên tất cả các tập tin / thư mục con trong thư mục hiện tại?

Hãy nói rằng, tôi có nhiều tệp và thư mục con có khoảng trắng và tôi muốn thay thế tất cả các khoảng trắng bằng dấu gạch dưới.

File 1
File 2
File 3
Dir 1
Dir 3

nên đổi tên thành

File_1
File_2
File_3
Dir_1
Dir_3

Câu trả lời:


36

Nếu bạn cũng cần đổi tên tệp trong thư mục con và findhỗ trợ -execdirvị ngữ của bạn , thì bạn có thể làm

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Cảm ơn @glenn jackman đã gợi ý -depthtùy chọn findvà khiến tôi suy nghĩ.

Lưu ý rằng trên một số hệ thống (bao gồm cả GNU / Linux), findcó thể không tìm thấy các tệp có tên chứa khoảng trắng và chuỗi byte không tạo thành các ký tự hợp lệ (điển hình với các tệp phương tiện có tên có ký tự không phải mã ASCII được mã hóa trong bộ ký tự khác với địa phương). Đặt ngôn ngữ thành C(như trong LC_ALL=C find...) sẽ giải quyết vấn đề.


Bạn sẽ cần sử dụng find -maxdepth 1để làm chính xác những gì OP yêu cầu khi vận hành trên thư mục hiện tại.
Caleb

1
Sử dụng -depthtùy chọn find , và bạn có thể thoát khỏi sort.
glenn jackman

@glenn jackman: cảm ơn bạn, giờ tôi đã hiểu giải pháp của mình là sai.
enzotib

2
Thay đổi -name '* *'để -name '*_*'và thay đổi "${1// /_}"để"${1//_/.}"
enzotib

1
@kroiz: nó được gọi là "Thay thế mẫu". Bạn có thể tìm thấy nó trong bashtrang người đàn ông.
enzotib

34

Trong bất kỳ shell nào, bạn có thể lặp qua các tệp có tên chứa khoảng trắng. Việc thay thế các khoảng trắng bằng dấu gạch dưới rất dễ dàng trong bash, ksh và zsh với ${VARIABLE//PATTERN/REPLACEMENT}cấu trúc.

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

Trên Debian, Ubuntu và các công cụ phái sinh, bạn có thể sử dụng Perl rename(các bản phân phối khác gửi một chương trình khác như renamevà chương trình đó không hữu ích ở đây).

rename 's/ /_/g' *

Một giải pháp zsh bắt buộc:

autoload zmv
zmv '(*)' '${1// /_}'

Một giải pháp POSIX bắt buộc:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

Chữ 'g' ở cuối lệnh "đổi tên" nghĩa là gì? Tôi đã không nhìn thấy nó trong hướng dẫn.
JulianLai

Làm thế nào để đổi tên thư mục? Tôi không muốn thay đổi tên tệp.
JulianLai

@JulianLai s/…/…/gcó nghĩa là thay thế tất cả các lần xuất hiện. Nó không được giải thích rõ trong hướng dẫn . Nếu bạn muốn đổi tên thư mục, có nhiều cách, vui lòng tìm kiếm nó (tôi nghĩ rằng tôi đã thấy nó trước đây) và nếu bạn không thể tìm thấy nó hãy hỏi một câu hỏi mới.
Gilles 'SO- ngừng trở nên xấu xa'

tuyệt vời ... điều này đã giúp tôi đổi tên tất cả _MG_blah.JPGthành IMG_blah.JPG.
Abinash Dash

13

Bạn có thể sử dụng renamecho việc này (ở đây giả sử một từ util-linuxchứ không phải perlmột):

cd /path/to/dir
rename ' ' _ *\ *

Điều này sẽ tìm thấy tất cả không gian tệp và thư mục trong tên và thay thế không gian bằng dấu gạch dưới. Vì nó sử dụng khớp tập tin toàn cầu, bạn cần phải ở trong thư mục bên phải để bắt đầu.

Nếu bạn muốn thực hiện các kết hợp đệ quy bạn có thể, nhưng bạn có thể phải thực thi renamemột vài lần để bắt bất kỳ mục nào trong các thư mục mà chúng được đổi tên:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

2
renameSẽ đổi tên các tập tin định bằng cách thay thế đầu tiên xảy ra từ trong tên của họ bằng cách đến .” Vì vậy, đây sẽ chỉ làm việc cho các tập tin với một không gian duy nhất trong tên của họ. (Bạn có thể gọi renametrong một vòng lặp, nhưng nó không thực sự là công cụ phù hợp ở đây.)
Gilles 'SO- ngừng trở nên xấu xa'

2

Một lựa chọn khác sẽ là mmv, nếu được cài đặt.

mmv \*\ \* \#1_#2

Điều này chỉ thay đổi không gian đầu tiên thành một _, nó không hoạt động tên với nhiều không gian.
Gilles 'SO- ngừng trở nên xấu xa'

Oups, bạn đúng. Xin lỗi vì sự nhầm lẫn.
glglgl

1

Trên Debian / Ubuntu, dựa trên câu trả lời của Caleb và Gilles, đây là cách giúp tôi đổi tên các tệp theo cách đệ quy:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Lưu ý: Để xem trước những tập tin nào sẽ được đổi tên và làm thế nào, hãy sử dụng công -ntắc với rename:

rename -n 's/ /_/g' **

Một lưu ý khác: cài đặt globstartạo **các tệp trùng khớp trong tất cả các thư mục con, vì vậy nếu chỉ có thư mục hiện tại là mong muốn, đừng đặt globalstar hoặc sử dụng *thay vì **.

Thêm một lưu ý: renameLệnh cần được chạy nhiều lần cho các tệp có nhiều lần xuất hiện của cụm từ tìm kiếm.


Điều đó chỉ hoạt động nếu thư mục không chứa không gian. (đổi tên a b/c dthành a_b/c_dsẽ không hoạt động, trước tiên bạn cần đổi tên a b/c dthành a b/c_dvà sau đó a ba_b).
Stéphane Chazelas

@Stephane: Có nghĩa là chạy cùng một renamelệnh hai lần?
Markus Pscheidt

Vâng, giống như nhiều lần như có các cấp độ thư mục lồng nhau với không gian. Lý tưởng nhất là bạn muốn duyệt qua độ sâu thư mục trước và chỉ chuyển đổi tên cơ sở của tệp như trong giải pháp được chấp nhận. Cũng lưu ý rằng bash's **loại trừ dotfiles và truyền tải các liên kết tượng trưng.
Stéphane Chazelas

0

Nếu bạn không phải là đèn flash ở các biểu thức thông thường (Tôi không phải!) Và bạn có thể chạy các ứng dụng được thiết kế cho kde (hoặc bạn sử dụng máy tính để bàn kde - k hoặc bạn đã cài đặt thư viện), thì krename là một tiện ích đồ họa tuyệt vời cho phép bạn xem trước và sau khi bạn cam kết thay đổi. Nó có một số biến đổi đơn giản làm tùy chọn và cũng hỗ trợ các biểu thức thông thường. Bạn thậm chí có thể kết hợp một số biến đổi tuần tự thành một lần đổi tên để bạn không phải thiết kế một biến đổi phức tạp duy nhất thực hiện cùng một lúc. Nó cũng có một tùy chọn để tiếp tục đổi tên các tệp tương tự sau khi đổi tên đã được áp dụng.

Tôi không sử dụng nó thường xuyên, nhưng khi tôi làm, nó thực sự hoàn thành công việc nhanh chóng và dễ dàng. Nó thực sự hữu ích khi đổi tên các tệp phương tiện đã tải xuống khác nhau để bạn có thể quản lý chúng thống nhất trên hệ thống của mình. Nó giúp tải xuống hướng dẫn sử dụng krename một cách riêng biệt để bạn có thể tham khảo nó trong khi sử dụng chương trình.

http://www.krename.net/

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.