Ö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 xargskullanı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 fordö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 lsile xargsbu 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.datve 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.ansbiten 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.ansdosyalar üretir ve dosya adları içeriyorsa bozulur ". Bunun bashiç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"' {} \;