Disons que je suis dans un répertoire qui a des sous - répertoires, dir1
, dir2
et dir3
. Chacun de ces répertoires a un fichier foo
et je voudrais exécuter la même commande sur chacun foo
dans chacun des répertoires et que cette commande soit exécutée à l'intérieur de ce répertoire.
Si je devais le faire "à la main", cela ressemblerait à ceci:
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
Il est impératif que la commande soit exécutée à partir de chacun des répertoires . foo
est un script de planification par lots (pour HTCondor, si vous voulez savoir) et doit être exécuté à partir de chaque sous-répertoire afin que la sortie des exécutions démarrées par les scripts de planification se retrouve dans chaque sous-répertoire.
La question " Trouver un fichier et exécuter une commande dans le répertoire du fichier ", pour autant que je sache, ne répond pas à ma question. La première réponse à cette question est plus une solution de contournement qui ne fonctionnera pas dans mon cas, et la deuxième réponse n'a pas suffisamment d'explication pour que je sache comment l'utiliser.
Réponses:
En supposant que votre
find
support, utilisez l'-execdir
option au lieu de-exec
Si ce n'est pas le cas, veuillez fournir des détails sur votre plate-forme et / ou distribution (le cas échéant).
la source
{}
, mais le parent de{}
.-exec
, mais la commande spécifiée est exécutée à partir du sous-répertoire contenant le fichier correspondant ".En supposant que vous savez exactement dans quels répertoires exécuter votre commande,
ou, en boucle sur les
foo
fichiers,Le sous-shell empêche le
cd
d'affecter le répertoire de travail du reste du script. La${foo%/*}
substitution de paramètres se développe jusqu'au nom du répertoire où réside lefoo
fichier (en supprimant tout après le dernier/
dans la valeur de$foo
).Utiliser standard
find
pour faire la même chose (dans le cas où lesfoo
fichiers peuvent vivre au fond d'une structure de répertoire):En mots: recherchez tous les fichiers normaux appelés "foo" n'importe où dans le répertoire courant ou ci-dessous et donnez leurs chemins d'accès à ce script shell par lots. Le script shell doit itérer sur les chemins d'accès donnés, changer de répertoire pour la partie répertoire de chaque chemin d'accès et si cela réussit, exécuter
somecommand foo
.Pour une solution qui utilise le non standard
-execdir
, voir la réponse de roaima . Sa réponse adaptée à mon exemple:la source