En bash, j'utilise souvent des boucles for telles que les suivantes
for file in *.type; do
sommecommand "$file";
done;
pour effectuer une opération pour tous les fichiers correspondants *.type
. Si aucun fichier avec cette fin n'est trouvé dans les répertoires de travail, l'astérisque n'est pas développé et j'obtiens généralement un message d'erreur indiquant qu'une commande n'a pas trouvé le fichier. Je peux immédiatement penser à plusieurs façons d'éviter cette erreur. Mais l'ajout d'un conditionnel ne semble pas très élégant. Existe-t-il un moyen court et propre d'y parvenir?
*.txt
. Il vaudrait la peine de vérifier si le fichier existe.break
place decontinue
).En bash, vous pouvez utiliser
shopt -s nullglob
pour développer un tableau vide s'il n'y a pas de correspondance.Dans les shells POSIX sans
nullglob
, vous pouvez éviter ce problème en vérifiant que le nom de fichier transmis existe réellement en ayant[ -e "$file" ] || [ -L "$file" ] || continue
comme première partie de votrefor
boucle.la source
[ -e
retournerait false pour les fichiers inaccessibles ou les fichiers qui sont des liens symboliques vers des fichiers inaccessibles ou inexistants.chmod 0 the_file
,[ -e the_file ]
j'évalue toujours vrai, cela doit donc être autre chose.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
. x / a est inaccessible mais comme x est lisible, x / * se développera.La technique habituelle pour les obus qui n'ont pas d'
nullglob
option estL'extra
[*].type
est de couvrir le cas où il y a un fichier appelé*.type
dans le répertoire courant.Maintenant, si vous souhaitez inclure des fichiers dot, cela devient plus compliqué .
Je crois que cette technique a été inventée par Laura Fairhead sur Usenet il y a quelques années.
la source
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
Cela supprime
for
entièrement la boucle et le globbing du shell de l'équation.find
exécutera la-exec
commande une fois par correspondance, et s'il n'y a aucune correspondance, elle ne sera jamais exécutée. Les-maxdepth 0
instructions recherchent de ne pas récursivement dans les sous-répertoires de l'argument de chemin nommé (.
, dans ce cas).L'inconvénient est qu'il s'agit d'une autre application, bien que celle-ci soit présente sur pratiquement tous les systèmes Linux (et probablement sur la plupart des Unix également).
la source