6 votes

xargs avec plusieurs commandes

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 xargs à peu près comme suit

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.

7voto

geekosaur Points 11085

Il pourrait être possible d'utiliser quelque chose du type

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 le mettre dans un Shell Shell afin que vous puissiez simplement lui passer 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édanterie : ls ne fera pas ce qu'il faut avec les caractères spéciaux, notamment les retours à la ligne incorporés, dans les noms de fichiers. Je laisserais tomber le xargs entièrement, et (étant donné le script ci-dessus) il suffit de faire

sh fiddle.sh *.txt

ou même

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

à l'invite.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X