Il n'est pas sûr d'analyser lsou de canaliser find[ 1 , 2 ]
Il n'est pas sûr d'analyser (et de diriger) la sortie de lsou find, principalement parce qu'il est possible de trouver dans les noms de fichiers des caractères non habituels comme la nouvelle ligne , l' onglet ... Ici un cycle de shell pur fonctionnera [ cuonglm ] .
Même la findcommande non canalisée avec l'option -execfonctionnera:
find ./*.png -exec basename {} .png \;
Mises à jour / notes : Vous pouvez utiliser find .pour rechercher même les fichiers cachés, ou find ./*.pngpour obtenir uniquement ceux qui ne sont pas cachés. Avec find *.png -exec ...vous pouvez avoir un problème dans le cas où il était présent un fichier nommé .pngcar find l'obtiendra en option. Vous pouvez ajouter -maxdepth 0pour éviter de descendre dans des répertoires nommés comme Dir_01.png, ou find ./*.png -prune -exec ...lorsque maxdepth n'est pas autorisé (merci Stéphane). Si vous souhaitez éviter de répertorier ces répertoires, vous devez ajouter l'option -type f(qui exclurait également d'autres types de fichiers non réguliers). Jetez un œil à la manpour un panorama plus complet sur toutes les options disponibles, et n'oubliez pas de vérifier quand elles sont conformes POSIX, pour une meilleure portabilité.
Quelques mots de plus
Il peut arriver, par exemple, qu'en copiant le titre d'un document et en le collant dans le nom de fichier, une ou plusieurs nouvelles lignes se terminent dans le nom de fichier lui-même. Nous pouvons même être si malchanceux qu'un titre peut contenir même la clé que nous devons utiliser juste avant une nouvelle ligne:
The new art of working on .png
files and other formats.
Si vous voulez tester, vous pouvez créer des noms de fichiers comme celui-ci avec les commandes
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"
Le simple /bin/ls *pngsortira ?au lieu des caractères non imprimables
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
Dans tous les cas où vous dirigerez la sortie de lsou findla commande suivante n'aura aucune indication pour comprendre si la ligne actuelle provient d'un nouveau nom de fichier ou si elle suit un caractère de nouvelle ligne dans le nom de fichier précédent . Un nom méchant en effet, mais toujours légal.
Un cycle de shell avec une extension de paramètre de shell ,,${parameter%word} dans la variante avec printfou echofonctionnera [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
À partir de la page de manuel de l'extension des paramètres du shell [ 3 ]
$ {paramètre% mot}
$ {paramètre %% mot}
... le résultat de l'expansion est la valeur du paramètre avec le modèle de correspondance le plus court (le cas '%') ou le modèle de correspondance le plus long (le cas '%%') supprimé.
.en eux. Bien que la convention indique de nommer vos fichiers.pngà la fin, il n'y a aucune raison pour laquelle je ne peux pas avoir de fichier png nomméfoo.zipoumy.picture.20160518ou simplementmypic.