xargs con múltiples comandos

6

Estoy tratando de ejecutar una secuencia de comandos en una lista de archivos uno por uno. Me preguntaba si es posible usar xargs algo en las líneas de

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

Dónde

cat {} | grep foo > {}.foo

es el comando que quiero ejecutar en cada archivo.

anand.trex
fuente

Respuestas:

7

Podría ser posible usar algo en la línea de

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

o, para deshacerse de lo inútil cat

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

Por lo general, es más fácil ponerlo en un script de shell para que pueda pasarle archivos.

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

Pedantry: lsno hará lo correcto con caracteres especiales, especialmente nuevas líneas incrustadas, en los nombres de archivo. Volcaría por xargscompleto, y (dado el script anterior) simplemente hago

sh fiddle.sh *.txt

o incluso

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

justo en el aviso.

geekosaur
fuente