J'ai quelque chose comme ça:
% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Je veux créer un répertoire bar
sous chacun des sous-répertoires sous foo
.
Si j'essaye de faire ça avec
% mkdir -p /tmp/foo/*/bar
... je reçois l'erreur
zsh: no matches found: /tmp/foo/*/bar
(Avec le recul, je peux comprendre la raison de l'erreur.)
Je sais que je peux résoudre le problème d'origine avec une boucle for, mais je suis curieux de savoir s'il zsh
prend en charge une certaine forme d'expansion de paramètres qui produirait l'argument souhaité pour une seule invocation de mkdir -p
. IOW, une extension de paramètre équivalente à "ajouter /bar
à chaque préfixe généré par l'expansion /tmp/foo/*
", résultant en
% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
mkdir -p
, ce qui aurait l'effet légèrement différent de votre commande de ne pas lancer d'erreurs si certains de ces répertoires ont déjà desbar
sous - répertoires. Point mineur mais à noter ici. :)${^spec}
et à ajouterbar
à chaque élément de ce qui se/tmp/foo/*(/)
développe pour:set -- /tmp/foo/*(/)
ensuitemkdir -p -- "${^@}/bar"
Bien sûr - utilisez une boucle
les globes sont utilisés pour développer des listes d' éléments existants , pas des choses qui n'ont pas encore été créées.
la source
zsh
pouvez développer des globes et ajouter du texte avec une seule syntaxe, mais je pense que c'est probablement la seule façon de faire ce que vous voulez, @kjo.Si les répertoires sont dans un tableau, vous pouvez utiliser la
${^...}
forme d'extension.la source
Vous pouvez utiliser
find
etxargs
pour le faire:qui utilise
-maxdepth 1
et-mindepth 1
pour empêcher la création debar
sous-répertoires de cibles, et en/tmp/foo
soi respectivement.type d
le fait considérer uniquement les répertoires.Vous devez supprimer
echo
pour effectuer des actions réelles, sinon vousecho
n'imprimerez que les lignes à exécuter. Vous pouvez également le placer en substitution comme$()
pour l'exécuter.Le manuel dit qu'il
xargs -i
est obsolète, mais je n'ai trouvé aucune autre alternative tout aussi pratique, donc cela devrait encore fonctionner pendant quelques années ... Vous pouvez remplacer-i
par-I'{}'
pour être à jour avec cela.la source
@loa_in_ en avait la plupart, mais la
find
sortie de la tuyauterie a tendance à être un faux pas.la source
xargs
avec différents outils qui n'ont pas d'-exec
alternative, donc j'utilise mon approche car elle fonctionne avec tous également.