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. xargsboş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 .
-lbayrağını kullanabilirsiniz find . -maxdepth 1 -print0 | xargs -0 -l rm. İkinci soru için, kullanmak olamaz lsile xargs -0ancak (BTW Dosya adlarında geçerlidir) satırsonu ile, ls boş Bute üzerinde çıktı bölmek değil çünkü
-0seçeneği olmayan xargs boşluk sorunundan muzdarip.
man xargs, echotest için kullanın , değil rm. xargskabuk 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-limitsve sisteminizde belirlenen sınırı göreceksiniz,
xargssiz 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.