2012-08-01 12 views
6

Trước:awk, sed: một lệnh lót để xóa dấu cách khỏi tên tệp _all_ trong một thư mục nhất định?

eng-vshakya:scripts vshakya$ ls 
American Samoa.png     Faroe Islands.png     Saint Barthelemy.png 

Sau:

eng-vshakya:scripts vshakya$ ls 
AmericanSamoa.png     FaroeIslands.png     SaintBarthelemy.png 

thử dưới đây nguyên mẫu, nhưng nó không hoạt động :(Xin lỗi, không phải là rất tốt khi nói đến awk/sed :(

ls *.png | sed 's/\ /\\\ /g' | awk '{print("mv "$1" "$1)}' 

[Trên đây là nguyên mẫu, lệnh thực, tôi đoán, sẽ là:

ls *.png | sed 's/\ /\\\ /g' | awk '{print("mv "$1" "$1)}' | sed 's/\ //g' 

]

+3

Điều này gặp phải vấn đề [Phân tích cú pháp ls] (http://mywiki.wooledge.org/ParsingLs). Sử dụng giải pháp ghoti thay vào đó, nếu vỏ của bạn hỗ trợ nó. – Graham

+0

@Graham: Tôi không biết về vấn đề Phân tích cú pháp. Liên kết rất hữu ích. cảm ơn – Viren

Trả lời

7

giải pháp của ghoti là điều đúng đắn cần làm. Vì bạn hỏi làm thế nào để làm điều đó trong sed, đây là một cách:

for file in *; do newfile=$(echo "$file" | tr -d \\n | sed 's/ //g'); 
    test "$file" != "$newfile" && mv "$file" "$newfile"; done 

Các tr là có để loại bỏ dòng mới trong tên tập tin, và là cần thiết để đảm bảo rằng sed thấy toàn bộ tên tập tin trong một dòng.

15

Không cần sử dụng awk hoặc sed khi bạn có thể làm điều này trong bash thuần túy.

[[email protected] ~/tmp1]$ ls -l 
total 2 
-rw-r--r-- 1 ghoti wheel 0 Aug 1 01:19 American Samoa.png 
-rw-r--r-- 1 ghoti wheel 0 Aug 1 01:19 Faroe Islands.png 
-rw-r--r-- 1 ghoti wheel 0 Aug 1 01:19 Saint Barthelemy.png 
[[email protected] ~/tmp1]$ for name in *\ *; do mv -v "$name" "${name// /}"; done 
American Samoa.png -> AmericanSamoa.png 
Faroe Islands.png -> FaroeIslands.png 
Saint Barthelemy.png -> SaintBarthelemy.png 
[[email protected] ~/tmp1]$ 

Lưu ý rằng các ký hiệu ${foo/ /}bash, và không hoạt động trong vỏ Bourne cổ điển.

+0

cảm ơn câu trả lời. và mặc dù tôi hiểu đây là cách đúng để làm, nhưng ý định đặt câu hỏi này là nhiều hơn cho việc học tập cá nhân của tôi và không phải là một phần của bất kỳ hệ thống sản xuất nào. vì vậy tôi chấp nhận câu trả lời của ông Pursell. – Viren