xargs avec plusieurs commandes

6

J'essaie d'exécuter une séquence de commandes sur une liste de fichiers, un par un. Je me demandais s’il était possible d’utiliser quelque chose sur xargs sur les lignes de

ls *.txt | xargs -n 1 -I {} cat {} | grep foo > {}.foo

cat {} | grep foo > {}.foo

est la commande que je veux exécuter sur chaque fichier.

anand.trex
la source

Réponses:

7

Il serait peut-être possible d’utiliser quelque chose du genre

xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'

ou, pour se débarrasser de l'inutile cat

xargs -n1 -I{} sh -c 'grep foo {} > ().foo'

Il est généralement plus facile de l'insérer dans un script shell afin de pouvoir simplement lui transmettre des fichiers.

cat > fiddle.sh <<\EOF
for f in "$@"; do
  grep foo "$f" >"$f.foo"
done
EOF
ls *.txt | xargs sh fiddle.sh    # note we can now pass multiple files, no -n1 or -I needed

Pédantisme: ls ne fera pas la bonne chose avec les caractères spéciaux, notamment les nouvelles lignes intégrées, dans les noms de fichiers. Je viderais le xargs entièrement, et (étant donné le script ci-dessus) juste faire

sh fiddle.sh *.txt

ou même

for f in *.txt; do grep foo "$f" >"$f.txt"; done

juste à l'invite.

geekosaur
la source