it-mot-dan-vi.com

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?

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
43
NobbZ

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

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

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

Lưu ý rằng trên một số hệ thống (bao gồm cả GNU/Linux), find có 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 không có tên Các ký tự ASCII được mã hóa trong bộ ký tự khác với miền địa phương). Đặt ngôn ngữ thành C (như trong LC_ALL=C find...) sẽ giải quyết vấn đề.

37
enzotib

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ế khoảng trắng bằng dấu gạch dưới rất dễ dàng trong bash, ksh và zsh bằng ${VARIABLE//PATTERN/REPLACEMENT} xây dựng.

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 là rename, và 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

Bạn có thể sử dụng rename cho việc này (ở đây giả sử một từ util-linux, không phải Perl mộ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 khớp đệ quy bạn có thể, nhưng bạn có thể phải thực thi rename mộ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 ' ' _ **/*\ *
!!; !!
13
Caleb

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

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

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 -n chuyển đổi với rename:

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

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

Thêm một lưu ý: Lệnh rename 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.

1
Markus Pscheidt

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 trước mà 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 một cách 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/

0
Joe