2012-08-01 20 views
6

Antes:awk, sed: un comando liner para eliminar espacios de _todos los nombres de archivo en una carpeta determinada?

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

Después:

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

Probamos a continuación prototipo, pero no funciona :(Lo siento, no es muy bueno cuando se trata de awk/sed :(

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

[Arriba está el prototipo, el comando real, supongo, sería:

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

]

+3

Esto sufre del [problema de análisis de ls] (http://mywiki.wooledge.org/ParsingLs). Use la solución de ghoti en su lugar, si su caparazón lo admite. – Graham

+0

@Graham: No estaba al tanto del problema de análisis de ls. Link fue muy útil. Gracias – Viren

Respuesta

7

La solución de ghoti es lo que debe hacer. Ya que preguntas cómo hacerlo en el SED, aquí hay una manera:

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

El tr está ahí para eliminar los saltos de línea en el nombre del archivo, y es necesario garantizar que sed ve todo el nombre del archivo en una sola línea.

15

No necesita usar awk o sed cuando puede hacerlo en pure 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]$ 

Tenga en cuenta que la notación es ${foo/ /}fiesta, y no funciona en Classic Shell Bourne.

+0

gracias por la respuesta. y aunque entiendo que esta es la manera correcta de hacerlo, pero la intención de hacer esta pregunta fue más para mi aprendizaje personal y no ser parte de ningún sistema de producción. entonces estoy aceptando la respuesta del Sr. Pursell. – Viren

Cuestiones relacionadas