No es seguro analizar ls
o canalizar find
[ 1 , 2 ]
No es seguro analizar (y canalizar) la salida de ls
o find
, principalmente porque es posible encontrar en los nombres de archivo caracteres no habituales como la nueva línea , la pestaña ... Aquí funcionará un ciclo de shell puro [ cuonglm ] .
Incluso el find
comando no conectado con la opción -exec
funcionará:
find ./*.png -exec basename {} .png \;
Actualizaciones / Notas : puede usar find .
para buscar incluso los archivos ocultos, o find ./*.png
para obtener solo los no ocultos. Con find *.png -exec ...
usted puede tener un problema en el caso de que estuviera presente un archivo llamado .png
porque find lo obtendrá como una opción. Puede agregar -maxdepth 0
para evitar descender en directorios nombrados como Dir_01.png
, o find ./*.png -prune -exec ...
cuando maxdepth no está permitido (gracias Stéphane). Si desea evitar enumerar esos directorios, debe agregar la opción -type f
(que también excluiría otros tipos de archivos no regulares). Eche un vistazo al man
para obtener un panorama más completo sobre todas las opciones disponibles, y recuerde verificar cuándo son compatibles con POSIX, para una mejor portabilidad.
Algunas palabras mas
Puede suceder, por ejemplo, que al copiar el título de un documento y pegarlo en el nombre del archivo, una o más líneas nuevas terminen en el nombre del archivo. Podemos ser tan desafortunados que un título puede contener incluso la clave que tenemos que usar justo antes de una nueva línea:
The new art of working on .png
files and other formats.
Si desea probar, puede crear nombres de archivo como este con los comandos
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
El simple /bin/ls *png
saldrá en ?
lugar de los caracteres no imprimibles
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
En todos los casos en los que se quiere canalizar la salida del ls
o find
el comando siguiente tendrán ningún indicio de entender si la actual línea proviene de un nuevo nombre de archivo o si se sigue una nueva línea carácter en el precedente nombre de archivo . Un nombre desagradable en verdad, pero aún legal.
Un ciclo de shell con un parámetro Parameter-Expansion, ${parameter%word}
en la variante con printf
o echo
funcionará [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Desde la página del manual de la expansión de parámetros de Shell [ 3 ]
$ {parámetro% palabra}
$ {parámetro %% palabra}
... el resultado de la expansión es el valor del parámetro con el patrón de coincidencia más corto (el caso '%') o el patrón de coincidencia más largo (el caso '%%') eliminado.
.
en ellos. Aunque la convención dice para nombrar sus archivos con.png
al final, no hay ninguna razón por qué no puedo tener un archivo PNG nombradofoo.zip
omy.picture.20160518
o simplementemypic
.