Utiliser la sortie de ls
pour obtenir des noms de fichiers est une mauvaise idée . Cela peut entraîner des dysfonctionnements et même des scripts dangereux. En effet, un nom de fichier peut contenir n'importe quel caractère, sauf /
et le caractère null
, et ls
n'utilise aucun de ces caractères comme délimiteurs, donc si un nom de fichier comporte un espace ou un saut de ligne, vous obtiendrez des résultats inattendus.
Il existe deux très bonnes façons d'itérer sur les fichiers. Ici, j'ai utilisé simplement echo
pour montrer comment faire quelque chose avec le nom de fichier ; vous pouvez cependant utiliser n'importe quoi.
La première consiste à utiliser les fonctions de globbing natives du shell. Le shell développe */
en arguments séparés que la boucle for
lit ; même s'il y a un espace, un saut de ligne ou tout autre caractère étrange dans le nom du fichier, for
verra chaque nom complet comme une unité atomique ; il n'analyse pas la liste de quelque façon que ce soit. Si vous voulez aller récursivement dans des sous-répertoires, alors cela ne fera pas l'affaire à moins que votre shell n'ait des fonctionnalités de globbing étendues (comme bash
. Si votre shell n'a pas ces fonctionnalités, ou si vous voulez vous assurer que votre script fonctionnera sur une variété de systèmes, alors la prochaine option est d'utiliser globstar
.
for dir in */; do
echo "$dir"
done
Ici, la commande find
appellera find
et lui passera un argument du nom du fichier. Elle le fait une fois pour chaque fichier qu'elle trouve. Comme dans l'exemple précédent, il n'y a pas d'analyse d'une liste de noms de fichiers ; à la place, un nom de fichier est envoyé complètement en argument.
La syntaxe de l'argument echo
est un peu bizarre. -exec
prend le premier argument après find
et le traite comme le programme à exécuter, et chaque argument suivant, il le prend comme argument à passer à ce programme. Il y a deux arguments spéciaux que -exec
doit voir. Le premier est -exec
; cet argument est remplacé par un nom de fichier que les parties précédentes de {}
génèrent. Le second est find
, ce qui permet à ;
de savoir que c'est la fin de la liste des arguments à passer au programme ; find
en a besoin car vous pouvez continuer avec d'autres arguments qui sont destinés à find
et non destinés au programme exécuté. La raison du find
est que le shell traite également le [ Utiliser la sortie de
lspour obtenir des noms de fichiers est une mauvaise idée ]&003. Cela peut entraîner des dysfonctionnements et même des scripts dangereux. En effet, un nom de fichier peut contenir n'importe quel caractère, sauf
/et le caractère
null, et
ls` n'utilise aucun de ces caractères comme délimiteurs, donc si un nom de fichier comporte un espace ou un saut de ligne, vous obtiendrez des résultats inattendus.
Il existe deux très bonnes façons d'itérer sur les fichiers. Ici, j'ai utilisé simplement echo
pour montrer comment faire quelque chose avec le nom de fichier ; vous pouvez cependant utiliser n'importe quoi.
La première consiste à utiliser les fonctions de globbing natives du shell. Le shell développe */
en arguments séparés que la boucle for
lit ; même s'il y a un espace, un saut de ligne ou tout autre caractère étrange dans le nom du fichier, for
verra chaque nom complet comme une unité atomique ; il n'analyse pas la liste de quelque façon que ce soit. Si vous voulez aller récursivement dans des sous-répertoires, alors cela ne fera pas l'affaire à moins que votre shell n'ait des fonctionnalités de globbing étendues (comme bash
. Si votre shell n'a pas ces fonctionnalités, ou si vous voulez vous assurer que votre script fonctionnera sur une variété de systèmes, alors la prochaine option est d'utiliser globstar
.
for dir in */; do
echo "$dir"
done
Ici, la commande find
appellera find
et lui passera un argument du nom du fichier. Elle le fait une fois pour chaque fichier qu'elle trouve. Comme dans l'exemple précédent, il n'y a pas d'analyse d'une liste de noms de fichiers ; à la place, un nom de fichier est envoyé complètement en argument.
La syntaxe de l'argument echo
est un peu bizarre. -exec
prend le premier argument après find
et le traite comme le programme à exécuter, et chaque argument suivant, il le prend comme argument à passer à ce programme. Il y a deux arguments spéciaux que -exec
doit voir. Le premier est -exec
; cet argument est remplacé par un nom de fichier que les parties précédentes de {}
génèrent. Le second est find
, ce qui permet à ;
de savoir que c'est la fin de la liste des arguments à passer au programme ; find
en a besoin car vous pouvez continuer avec d'autres arguments qui sont destinés à find
et non destinés au programme exécuté. La raison du find
est que le shell traite également le de manière spéciale - il représente la fin d'une commande, nous devons donc l'échapper pour que le shell le donne comme argument à ;
plutôt que de le consommer pour lui-même ; une autre façon d'amener le shell à ne pas le traiter de manière spéciale est de le mettre entre guillemets : find
fonctionne aussi bien que ';'
dans ce but.