Linux - Thay thế khoảng trắng trong tên tệp


96

Tôi có một số tệp trong một thư mục và tôi muốn thay thế mọi ký tự khoảng trắng trong tất cả các tên tệp bằng dấu gạch dưới. Làm thế nào tôi có thể đạt được điều này?

Câu trả lời:


172

Điều này nên làm điều đó:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

Điều này không hiệu quả với tôi. Nó yêu cầu các tệp giống hệt nhau tồn tại (với tên tệp sai). Ví dụ: cố gắng đổi tên 1 - foo.jpgvà thư mục của tôi đã có 1.jpgtrong đó.
byxor

3
Tôi thấy dấu gạch ngược hơi khó đọc khi chúng ở gần dấu ngoặc kép. Điều tương tự nhưng dễ đọc hơn sẽ làfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

Lưu ý: Điều này được chạy từ TRONG VÒNG thư mục có tên tệp bạn muốn cập nhật. Ngoài ra, bạn có thể thay đổi *thành PATH_TO_YOUR_DIRECTORY.
CFitz

71

Tôi thích sử dụng lệnh 'đổi tên', lệnh này lấy regexes kiểu Perl:

rename "s/ /_/g" *

Bạn có thể chạy nhanh với cờ -n:

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

3
điều này sẽ làm việc nếu bạn có đổi tên perl-phong cách và không phải là đơn giản hơn redhat / fedora một
David Dean

9
phiên bản fedora sẽ làrename " " "_" *
David Dean,

4
renamekhông có sẵn trong OSX nó xuất hiện.
Etienne Low-Décarie

Trên macOS 10.12.3, renamecó sẵn.
Sung Cho

1
@DavidDean Việc đổi tên trên Arch Linux sẽ chỉ thay thế lần xuất hiện đầu tiên (không thuận tiện cho các tệp / thư mục có nhiều khoảng trắng). Nó có cùng cú pháp với chiếc mũ phớt, vì vậy tôi nghi ngờ chúng có thể giống nhau. Nhưng perl-rename có thể được cài đặt.
prosoitos

15

Sử dụng sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Nếu bạn muốn thử điều này trước khi bóp cò, chỉ cần thay đổi mvthành echo mv.


4

Nếu bạn sử dụng bash:

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

khi tôi thử, tôi nhận được mv: khi di chuyển nhiều tệp, đối số cuối cùng phải là thư mục Thử mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'để biết thêm thông tin.
Mithun Sreedharan

Một lần nữa lỗi mv: thiếu đối số tệp Hãy thử mv --help' for more information. mv: missing file argument Try mv --help 'để biết thêm thông tin. mv: thiếu đối số tệp Hãy thử mv --help' for more information. mv: missing file argument Try mv --help 'để biết thêm thông tin.
Mithun Sreedharan

@ levislevis85: Thx, không biết điều đó.
soulmerge

4

Điều gì xảy ra nếu bạn muốn áp dụng tác vụ thay thế cách đệ quy ? Bạn làm điều đó như thế nào?

Chà, tôi vừa tự tìm ra câu trả lời. Không phải là giải pháp thanh lịch nhất, (cũng cố gắng đổi tên các tệp không tuân thủ điều kiện) nhưng nó hoạt động. (BTW, trong trường hợp của tôi, tôi cần đổi tên tệp bằng '% 20', không phải bằng dấu gạch dưới)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

2

Hãy thử một cái gì đó như thế này, giả sử tất cả các tệp của bạn là .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
gặp lỗi dưới đây tr: phải cung cấp hai chuỗi khi dịch đối số tệp mv: thiếu Hãy thử `mv --help 'để biết thêm thông tin.
Mithun Sreedharan

2
Lỗi bắt đầu tr: quá nhiều đối số Hãy thử tr --help' for more information. mv: missing file argument Try mv --help 'để biết thêm thông tin.
Mithun Sreedharan

2

Đây là một giải pháp khác:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. sử dụng awk để thêm dấu ngoặc kép xung quanh tên của tệp
  2. sử dụng sed để thay thế khoảng trắng bằng dấu gạch dưới; in tên gốc với dấu ngoặc kép (từ awk); sau đó là tên được thay thế
  3. xargs lấy 2 dòng một lúc và chuyển nó đến mv

1

Trích dẫn các biến của bạn:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Loại bỏ "tiếng vang" để thực hiện đổi tên thực tế.


Nó đang lặp lại các lệnh mv prperly, nhưng không thực sự đổi tên tệp!
Mithun Sreedharan

loại bỏ tiếng vang sản xuất lỗi như mv: không thể stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Không có tập tin hoặc thư mục mv: không thể stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Không có tập tin hoặc thư mục
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Thứ sáu, 14 tháng 8, 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

Cách dễ nhất để thay thế một chuỗi (ký tự khoảng trắng trong trường hợp của bạn) bằng một chuỗi khác Linuxđược sử dụng sed. Bạn có thể làm như sau

sed -i 's/\s/_/g' *

Hi vọng điêu nay co ich.


Điều này không giải quyết câu hỏi.
amit


0

Để đổi tên tất cả các tệp bằng cách .pysử dụng tiện ích mở rộng, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Đầu ra mẫu,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
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.