Dans un script bash, comment dire "pour tous les fichiers de type .png ou .PNG"?
J'essaie :
for i in (`ls *.PNG` && `ls *.png`)
mais obtenir une erreur de syntaxe.
la source
Dans un script bash, comment dire "pour tous les fichiers de type .png ou .PNG"?
J'essaie :
for i in (`ls *.PNG` && `ls *.png`)
mais obtenir une erreur de syntaxe.
Si vous souhaitez toutes les combinaisons possibles, utilisez:
for i in *.[Pp][Nn][Gg]; do
ou
shopt -s nocaseglob
for i in *.png; do
bien que celui-ci rendra tous les globes shell de votre script (c'est-à-dire les correspondances de fichiers génériques) insensibles à la casse jusqu'à ce que vous exécutiez shopt -u nocaseglob
.
Si vous voulez vraiment seulement .PNG et .png (et pas, par exemple, .PnG ou .pnG), alors utilisez soit
shopt -s nullglob
for i in *.png *.PNG; do
ou
for i in *.png *.PNG; do
[[ -e "$i" ]] || continue
... la raison de la vérification nullglob ou de l'existence est que si vous n'avez que des extensions minuscules ou majuscules, cela inclura le modèle sans correspondance dans la liste des fichiers, conduisant à une erreur dans le corps de la boucle. Comme avec nocaseglob, vous voudrez peut-être désactiver l'option shell nullglob par la suite (bien que dans mon expérience, avoir nullglob activé est souvent bon, surtout dans un script). En fait, je considère plutôt comme une bonne idée d'utiliser soit le nocaseglob soit le contrôle d'existence pour toutes les correspondances de fichiers comme ceci, juste au cas où il n'y en aurait pas.
for i in *.{png,PNG}
Vous pouvez également essayer une doublure comme
ou
Modifier
Voir également le commentaire de @ Yab ci-dessous sur la récursivité.
la source
find -maxdepth 1 -iname "*.png"
ls
est presque inutile ici, mais pour mémoire, voici une syntaxe plus proche de votre tentative:Remarques:
la source