2009-11-27 26 views

Trả lời

104

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

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

Điều này đã không làm việc cho tôi. Nó cho rằng các tệp giống nhau tồn tại (với tên tệp sai). Ví dụ. cố gắng đổi tên '1 - foo.jpg' và thư mục của tôi đã có' 1.jpg' trong đó. – byxor

0

Tôi tin câu trả lời của bạn là ở Replace spaces in filenames with underscores.

+1

Trong khi lý thuyết này có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. –

1

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

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

nhận được lỗi dưới đây tr: hai chuỗi phải được đưa ra khi dịch mv: thiếu đối số tệp Thử 'mv --help 'để biết thêm thông tin. –

+2

Tr lỗi Agin: quá nhiều đối số Hãy thử 'tr --help 'để biết thêm thông tin. mv: thiếu đối số tệp Thử 'mv --help 'để biết thêm thông tin. –

3

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

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

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à một thư mục Thử 'mv --help 'để biết thêm thông tin. mv: khi di chuyển nhiều tệp, đối số cuối cùng phải là thư mục Thử 'mv --help 'để biết thêm thông tin. –

+0

Nên là '$ {FILE// _}' – soulmerge

+0

chỉ thay thế 1 dấu cách – ghostdog74

7

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 kéo kích hoạt chỉ cần thay đổi mv thành echo mv.

+0

Điều này cũng làm việc tốt –

1

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

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

Tháo "echo" để làm đổi tên thực tế.

+0

Nó đang lặp lại các lệnh mv một cách tinh vi, nhưng không thực sự đổi tên tệp! –

+0

loại bỏ tiếng vọng tạo ra lỗi như mv: không thể stat '\ '1130 hồ micigan view.jpg \' ': Không có tệp hoặc thư mục nào như vậy mv: không thể stat' \' 1130_1_bedroom_floor_plan.jpg \ '': Không có tệp hoặc thư mục nào mv: không thể stat '\ '1130_BedPicture_8.jpg \' ': Không có tập tin hoặc thư mục nào như vậy mv: không thể kê' \' 1130_diningroom_table.jpg \ '': Không có tập tin hoặc thư mục nào như vậy –

+0

HĐH của bạn là gì? – ghostdog74

40

Tôi thích sử dụng lệnh 'đổi tên', trong đó có regexes Perl-style:

rename "s/ /_/g" * 

Bạn có thể làm một chạy khô với cờ -n:

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

điều này sẽ hoạt động * nếu * bạn có đổi tên kiểu perl và không đơn giản redhat/fedora một –

+4

phiên bản fedora sẽ là 'đổi tên" "" _ "*' –

+3

'đổi tên' không có sẵn trong OSX nó xuất hiện. –

4

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

Vâng, tôi đã tự tìm thấy câu trả lời. Không có giải pháp thanh lịch nhất (cố gắng đổi tên các tệp cũng không tuân thủ điều kiện) nhưng hoạt động. (BTW, trong trường hợp của tôi, tôi cần thiết để đổi tên các tập tin với '% 20', không phải với một 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 
0

Cách đơn giản nhất để thay thế một chuỗi (nhân vật không gian trong trường hợp của bạn) bằng một chuỗi khác trong Linux là sử dụng sed. Bạn có thể thực hiện như sau

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

Hy vọng điều này sẽ hữu ích.

-1

Tôi đang cố gắng để chạy như một kịch bản https://hastebin.com/xemitireri.bash,

#!/bin/bash 
# https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names 
find . -type d | while read N 
do 
    (
      cd "$N" 
      if test "$?" = "0" 
      then 
       for file in *; do mv "$file" ${file// /_}; done 
      fi 
    ) 
done 

Tôi muốn chạy này một cách đệ quy, trên một thư mục, trong đó có nhiều thư mục trong đó, mỗi trong số đó có nhiều file trong đó. Cả tên thư mục và tên tệp đều có dấu cách trong đó (ví dụ: chạy nó trên thư mục "Thử nghiệm" chứa "Album Tốt" chứa "Đĩa 1", "Đĩa 2", v.v. Mỗi thư mục của đĩa có "Bài hát 1 .txt "," Bài hát 2.txt "," Bài hát 3.txt, v.v.) DID này đổi tên các thư mục, chứ không phải các tệp trong thư mục. Tôi gặp lỗi bash: cd: ./Disk 02: Không có tệp hoặc thư mục nào như vậy bash: cd: ./Disk 01: Không có tệp hoặc thư mục nào như vậy bash: cd:./ Đĩa 03: Không có tệp hoặc thư mục nào như vậy

+0

Đây không phải là câu trả lời, mà là một câu hỏi khác. Hãy cân nhắc việc mở một câu hỏi mới. – Fabien

Các vấn đề liên quan