Je voudrais lister tous les fichiers dans un dossier appelé foldername
qui ont l'extension test
, atest
ou btest
.
Ma pensée immédiate était de courir ls ./foldername/*.{a,b,}test
Cela fonctionne bien à moins qu'il n'y ait rien avec l'extension atest
, auquel cas j'obtiens l'erreur zsh: no matches found: ./foldername/*.atest
.
Existe-t-il un moyen de simplement ignorer cette erreur et d'imprimer les fichiers qui existent?
J'ai besoin de cela pour travailler à la fois dans ZSH et BASH.
/dev/null
?Réponses:
Il peut être préférable de le faire avec
find
:la source
-maxdepth 1
, pour imiter de plus près lels
comportement-maxdepth
s'agit d'une extension GNU. Remarque 3 autres différences avec les globes:find
incluraient des fichiers cachés, ne trieraient pas la liste et ne correspondraient pas aux noms de fichiers qui contiennent des octets ne formant pas des caractères valides (comme un$'St\xe9phane.atest'
dans un environnement local UTF-8)Dans
{a,b,...}
n'est pas un opérateur glob, c'est une expansion d'accolade, c'est d'abord étendu à:Et chaque glob est développé individuellement, et si un glob ne correspond pas, la commande est annulée comme vous pouvez vous y attendre
zsh
(oufish
; inbash
, vous avez besoin de l'failglob
option pour obtenir un comportement similaire).Ici, vous souhaitez utiliser un seul glob qui correspond à tous ces fichiers et annuler la commande uniquement si ce glob ne correspond à aucun fichier:
Vous ne voulez pas utiliser
nullglob
, comme si aucun des globes ne correspondait, il s'exécuteraitls
sans arguments, alors listez le répertoire courant.cshnullglob
est meilleur à cet égard car il supprime les globes non correspondants mais annule toujours la commande si tous les globs ne correspondent pas.Vous ne voudriez pas l'utiliser
nonomatch
, car cela vous donnerait un comportement cassébash
qui serait dommage.Pour une alternative glob qui fonctionne à la fois dans
zsh
etbash
, vous pouvez utiliser les globs ksh (set -o kshglob
inzsh
etshopt -s extglob
inbash
).Ensuite, vous feriez:
ou:
Ajoutez l'
failglob
option inbash
pour éviter que le glob ne soit transmis littéralementls
lorsqu'il ne correspond pas.Voir Pourquoi nullglob n'est-il pas par défaut? pour plus d'informations.
la source
?(...)
ou+(...)
pour bash.