Supposons que j'ai un répertoire avec des milliers de fichiers ; comment puis-je ouvrir tous les fichiers dont le nom contient à la fois les chaînes "rouge" et "vert" ?
Réponse acceptée :
(En supposant que vous recherchiez des noms de fichiers qui contiennent les deux la chaîne "rouge" et la chaîne "vert")
Pour utiliser inutilement bash pour tester les noms de fichiers par rapport au "rouge" et au "vert" en utilisant le =~
opérateur de correspondance d'expression régulière :
for f in *
do
[[ $f =~ red && $f =~ green ]] && echo Bash: yes: "$f" || echo Bash: no: "$f"
done
Pour utiliser la syntaxe standard du shell en utilisant case
et globs pour retrouver les mêmes fichiers :
for f in *
do
case "$f" in
*green*red*|*red*green*) echo Case: yes: $f;;
*) echo Case: no: $f;;
esac
done
Encore plus simple, avec le globbing de votre shell :
printf "Glob: %sn" *green*red* *red*green*
Exemple d'exécution :
$ touch a b aredgreenb agreenredb agreenbred aredbgreen red green redgreen greenred
$ for f in *
> do
> [[ $f =~ red && $f =~ green ]] && echo Bash: yes: "$f" || echo Bash: no: "$f"
> done
Bash: no: a
Bash: yes: agreenbred
Bash: yes: agreenredb
Bash: yes: aredbgreen
Bash: yes: aredgreenb
Bash: no: b
Bash: no: green
Bash: yes: greenred
Bash: no: red
Bash: yes: redgreen
$ for f in *
> do
> case "$f" in
> *green*red*|*red*green*) echo Case: yes: $f;;
> *) echo Case: no: $f;;
> esac
> done
Case: no: a
Case: yes: agreenbred
Case: yes: agreenredb
Case: yes: aredbgreen
Case: yes: aredgreenb
Case: no: b
Case: no: green
Case: yes: greenred
Case: no: red
Case: yes: redgreen
$ printf "Glob: %sn" *green*red* *red*green*
Glob: agreenbred
Glob: agreenredb
Glob: greenred
Glob: aredbgreen
Glob: aredgreenb
Glob: redgreen