xargs dengan banyak perintah

6

Saya mencoba mengeksekusi urutan perintah pada daftar file satu per satu. Saya bertanya-tanya apakah mungkin menggunakan xargs sesuatu di baris

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

Dimana

cat {} | grep foo > {}.foo

adalah perintah yang ingin saya jalankan pada setiap file.

anand.trex
sumber

Jawaban:

7

Mungkin dimungkinkan untuk menggunakan sesuatu di sepanjang baris

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

atau, untuk menyingkirkan yang tidak berguna cat

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

Biasanya lebih mudah untuk meletakkannya di skrip shell sehingga Anda bisa meneruskannya file.

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: lstidak akan melakukan hal yang benar dengan karakter khusus, terutama baris baru yang disematkan, dalam nama file. Saya akan membuang xargsseluruhnya, dan (mengingat skrip di atas) lakukan saja

sh fiddle.sh *.txt

atau bahkan

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

tepat di prompt.

geekosaurus
sumber