No es seguro analizar lso canalizar find[ 1 , 2 ]
No es seguro analizar (y canalizar) la salida de lso 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 findcomando no conectado con la opción -execfuncionará:
find ./*.png -exec basename {} .png \;
Actualizaciones / Notas : puede usar find .para buscar incluso los archivos ocultos, o find ./*.pngpara obtener solo los no ocultos. Con find *.png -exec ...usted puede tener un problema en el caso de que estuviera presente un archivo llamado .pngporque find lo obtendrá como una opción. Puede agregar -maxdepth 0para 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 manpara 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 *pngsaldrá 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 lso findel 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 printfo echofuncionará [ 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.pngal final, no hay ninguna razón por qué no puedo tener un archivo PNG nombradofoo.zipomy.picture.20160518o simplementemypic.