J'essaie d'écrire un script qui sera exécuté dans un répertoire donné avec plusieurs sous-répertoires à un seul niveau. Le script se place dans chacun des sous-répertoires, exécute une commande sur les fichiers du répertoire et se termine pour continuer dans le répertoire suivant. Quelle est la meilleure façon de procéder?
shell-script
Quelque chose Jones
la source
la source
youtube-dl
.Réponses:
la source
for d in ./*/
démarre une boucle qui stocke chaque élément dans./*/
(une liste de fichiers / dossiers, dans ce cas) dans une variable$d
.do (cd "$d" && somecommand);
commence le corps de la boucle. À l'intérieur du corps, il commence un sous - shell et exécute les commandescd
etsomecommand
. Comme il s'agit d'un shell enfant, le shell parent (celui à partir duquel vous exécutez cette commande) conserve son CWD et d'autres variables d'environnement.done
ferme simplement le corps de la boucle.for d in ./*/ ; do (cd "$d" && ls); done
ne fonctionnera pas. mais,for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); done
travaillera. -Utilisez ls comme commande dans cet exemple.-bash: cd: ./*/: No such file or directory
Le meilleur moyen est de ne pas utiliser
cd
du tout:execdir
est commeexec
, mais le répertoire de travail est différent:Ce n'est pas POSIX.
la source
find
exécute ces commandes, de sorte qu'il ne soit pas au courant des alias. Quel estmd
et est le.link
répertoire?bash
:find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;
Vous n'avez pas besoin de fairecat
avecwget
, qui a un-i
drapeau pour lire une URL à partir d'un fichier. En outre, cela diffère quelque peu de votre question initiale (car vous semblez ne vous intéresser qu'aux fichiers nommés.link
et non aux autres fichiers éventuellement présents).La commande ci-dessus n'a pas besoin de créer de sous-shell. Elle suit simplement sa progression dans le shell actuel en alternant
$OLDPWD
et$PWD
. Lorsquecd -
le shell échange la valeur de ces deux variables, en gros, il change de répertoire. Il affiche également le nom de chaque répertoire lorsqu’il fonctionne pour stderr.J'y ai jeté un deuxième coup d'œil et j'ai décidé que je pourrais faire un meilleur travail avec la gestion des erreurs. Il sautera un répertoire dans lequel il ne peut pas
cd
- etcd
affichera un message expliquant pourquoi stderr - etbreak
un code de sortie différent de zéro si votre programmecommand
ne s'exécute pas correctement ou si son exécutioncommand
affecte sa capacité à retourner dans votre répertoire d'origine. -$OLDPWD
. Dans ce cas, il effectue également uncd -
dernier et écrit le nom du répertoire de travail actuel résultant dans stderr.la source
la source