2011-10-13 2 views
5

Je cherche loin pour exécuter la commande en cours pour chaque résultat de globbing de fichier sans construire une boucle for. J'ai vu ça quelque part mais je ne me souviens plus exactement où.Puis-je exécuter la commande pour chaque résultat de globbing de fichier dans zsh sans pour?

(L'écho est juste un exemple, il devrait également fonctionner avec psql par exemple)

Exemple:

$ touch aaa bbb ccc ddd 
$ echo "--- " [a-c]* 
--- aaa bbb ccc 

sortie souhaitée:

--- aaa 
--- bbb 
--- ccc 

façon Kown:

$ for i in [a-c]*; do echo "--- " $i ; done 
--- aaa 
--- bbb 
--- ccc 

Cou Ld être fait en utilisant pour. Mais peut-être y a-t-il un moyen de le faire plus court? Peut-être que l'utilisation de doubles accolades autour du glob ou quoi que ce soit?

Merci. :)

Répondre

4

Vous recherchez peut-être zargs, une commande ayant le même objectif que xargs mais une interface plus saine.

autoload -U zargs 
zargs -n 1 -- * -- mycommand 
+0

Merci, semble "sain d'esprit" :) –

2

La commande printf bouclera implicitement si on leur donne plus d'arguments que des espaces réservés dans la chaîne de format:

printf -- "--- %s\n" [a-c]* 

Pour exécuter une commande sur chaque fichier, vous devez xargs: Je suppose que vous avez xargs GNU qui a l'option -0:

printf "%s\0" [a-c]* | xargs -0 -I FILE echo aa FILE bb 

Remplacer la commande echo xargs avec tout ce dont vous avez besoin, en utilisant l'espace réservé « FICHIER » où vous avez besoin du nom de fichier. Utilisez votre propre jugement pour déterminer si cela est réellement meilleur ou plus facile à maintenir qu'une boucle for-.png

+0

Oh, merci. Mais en réalité l'écho n'était qu'un exemple. La commande que je veux lancer est "psql ... -f $ i" :-) –

+0

@dedeibel, réponse mise à jour. –

+0

Merci pour la mise à jour, pas spécifique à zsh mais c'est cool. –

Questions connexes