Öncelikle, çıktıyı bir dosya listesi olarak kullanmayınls
. Kabuk genişletme kullanın veya find
. Ls + xargs yanlış kullanımının olası sonuçları ve uygun xargs
kullanım örneği için aşağıya bakın .
1. basit yolu: için döngü
Yalnızca altındaki dosyaları işlemek istiyorsanız A/
, basit bir for
döngü yeterli olacaktır:
for file in A/*.dat; do ./a.out < "$file" > "${file%.dat}.ans"; done
2. pre1 Neden olmasın ls | xargs
?
Burada kullanırsanız dönüşebilir ne kadar kötü bir örnek ls
ile xargs
bu iş için. Aşağıdaki senaryoyu inceleyin:
ilk olarak, bazı boş dosyalar oluşturalım:
$ touch A/mypreciousfile.dat\ with\ junk\ at\ the\ end.dat
$ touch A/mypreciousfile.dat
$ touch A/mypreciousfile.dat.ans
dosyaları görün ve hiçbir şey içermediğini görün:
$ ls -1 A/
mypreciousfile.dat
mypreciousfile.dat with junk at the end.dat
mypreciousfile.dat.ans
$ cat A/*
kullanarak sihirli bir komut çalıştırın xargs
:
$ ls A/*.dat | xargs -I file sh -c "echo TRICKED > file.ans"
sonuç:
$ cat A/mypreciousfile.dat
TRICKED with junk at the end.dat.ans
$ cat A/mypreciousfile.dat.ans
TRICKED
Sadece başardınız Yani hem üzerine yazmak mypreciousfile.dat
ve mypreciousfile.dat.ans
. Bu dosyalarda herhangi bir içerik olsaydı, silinirdi.
2. kullanma xargs
: ile uygun şekilde find
Eğer kullanmakta ısrar etmek istiyorsanız xargs
, şunu kullanın -0
(boş bırakılmış isimler):
find A/ -name "*.dat" -type f -print0 | xargs -0 -I file sh -c './a.out < "file" > "file.ans"'
İki şeye dikkat edin:
- bu şekilde
.dat.ans
biten dosyalar oluşturacaksınız ;
- Bu , eğer bir dosya adı bir alıntı işareti (
"
) içeriyorsa kırılır .
Her iki sorun da farklı kabuk çağırma yöntemleriyle çözülebilir:
find A/ -name "*.dat" -type f -print0 | xargs -0 -L 1 bash -c './a.out < "$0" > "${0%dat}ans"'
3. içinde yapılan tüm find ... -exec
find A/ -name "*.dat" -type f -exec sh -c './a.out < "{}" > "{}.ans"' \;
Bu, yine .dat.ans
dosyalar üretir ve dosya adları içeriyorsa bozulur "
. Bunun bash
için, çağrılma biçimini kullanın ve değiştirin:
find A/ -name "*.dat" -type f -exec bash -c './a.out < "$0" > "${0%dat}ans"' {} \;