2012-08-01 3 views
6

Prima:awk, sed: un comando di linea per rimuovere spazi da tutti i nomi di file in una determinata cartella?

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

Dopo:

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

provato sotto prototipo, ma non funziona :(Siamo spiacenti, non molto buono quando si tratta di awk/sed :(

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

[Sopra è il prototipo, il comando reale, suppongo, sarebbe:

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

]

+3

Questo soffre del [problema l 'analisi] (http://mywiki.wooledge.org/ParsingLs). Usa invece la soluzione di ghoti, se la tua shell lo supporta. – Graham

+0

@Graham: non ero a conoscenza del problema di Parsing ls. Link è stato molto utile. grazie – Viren

risposta

7

La soluzione di ghoti è la cosa giusta da fare. Dal momento che si chiede come si fa a sed, ecco un modo:

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

Il tr è lì per rimuovere a capo nel nome del file, ed è necessario garantire che sed vede l'intero nome del file in una sola riga.

15

Non è necessario utilizzare awk o sed quando è possibile farlo in puro bash.

[[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]$ 

Si noti che la notazione ${foo/ /} è bash, e non funziona in guscio classico Bourne.

+0

grazie per la risposta. e anche se capisco che questo è il modo giusto di fare, ma l'intenzione di porre questa domanda era più per il mio apprendimento personale e non far parte di alcun sistema di produzione. quindi accetto la risposta dell'onorevole Pursell. – Viren