Il n'est pas sûr d'analyser ls
ou de canaliser find
[ 1 , 2 ]
Il n'est pas sûr d'analyser (et de diriger) la sortie de ls
ou 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 find
commande non canalisée avec l'option -exec
fonctionnera:
find ./*.png -exec basename {} .png \;
Mises à jour / notes : Vous pouvez utiliser find .
pour rechercher même les fichiers cachés, ou find ./*.png
pour 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é .png
car find l'obtiendra en option. Vous pouvez ajouter -maxdepth 0
pour é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 man
pour 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 *png
sortira ?
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 ls
ou find
la 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 printf
ou echo
fonctionnera [ 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.zip
oumy.picture.20160518
ou simplementmypic
.