Yanıtlar:
Bir fark, bir boru yerine komut değiştirme kullanıldığında, iletilen verilerin boyutu komut arabelleğinin boyutu ile sınırlıdır, bu nedenle bazı durumlarda uyarı yapılmadan kesilir. Bu aynı zamanda tüm komut çıkışının bir sonraki komuta geçmeden önce üretilmesi ve bellekte saklanması gerektiği anlamına gelir, böylece büyük çıkışlar için gerekenden çok daha fazla bellek kullanabilirsiniz.
İlk yöntemle ilgili bir başka sorun, çıktının boşlukta bölünmesidir, bu nedenle içindeki boşluklarla dosya adlarını işleyemezsiniz. xargs
boşluk sorunundan da etkilenir, ancak kullanılan sınırlayıcı değiştirilerek düzeltilebilir. Bu arada dosya adlarını düzgün bir şekilde işlemek için, ikinci örnekte boş baytı sınırlayıcı olarak kullanmanız gerekir.
Üçüncü bir sorun, glob'ların genişletilmesidir, bu nedenle bir dosya adında yıldız işaretleri veya soru işaretleri varsa, beklenmedik sonuçlar olacaktır.
Konu hakkında güzel bir tartışma burada bulabilirsiniz: http://mywiki.wooledge.org/ParsingLs
Doğru sözdizimi
echo rm *
veya xargs kullanmanız gerekiyorsa,
find . -maxdepth 1 -print0 | xargs -0 echo rm
echo
Çıktı doğru göründüğünde çıkarın .
-l
bayrağını kullanabilirsiniz find . -maxdepth 1 -print0 | xargs -0 -l rm
. İkinci soru için, kullanmak olamaz ls
ile xargs -0
ancak (BTW Dosya adlarında geçerlidir) satırsonu ile, ls boş Bute üzerinde çıktı bölmek değil çünkü
-0
seçeneği olmayan xargs boşluk sorunundan muzdarip.
man xargs
, echo
test için kullanın , değil rm
. xargs
kabuk sınırlarını aşmamızı sağlar (bazı tamponlar 65K ile sınırlıdır, dosya adları listesi değildir).
xargs --show-limits
ve sisteminizde belirlenen sınırı göreceksiniz,
xargs
siz etkinleştirmedikçe boru nedeniyle bir alt kabukta da çalışırshopt -s lastpipe
, bu durumda geçerli kabukta çalışır. Değişkenleri değiştirmediğiniz için, bu durumda bir alt kabukta çalışmanın bir sorun olduğunu düşünmüyorum.