Dosya adlarını diğer programlara aktarmak istiyorum, ancak adlar boşluk içerdiğinde boğuluyorlar.
Diyelim ki adlı bir dosyam var.
foo bar
findDoğru adı nasıl iade edebilirim ?
Açıkçası istiyorum:
foo\ bar
veya:
"foo bar"
EDIT : Ben geçmek istemiyorum xargs, ben doğru bir şekilde biçimlendirilmiş bir dize dışarı almak istiyorum findböylece dosya adları dizesini doğrudan başka bir programa boru olabilir.
finddosya adlarını iyi biçimlendirir; her satıra bir isim yazılır. (Tabii ki, bir dosya adı yeni satır karakteri içeriyorsa bu muğlaktır.) Sorun, alan aldığında alıcı son "boğulma" dır; bu, anlamlı bir cevap istiyorsanız bize alıcı sonun ne olduğunu söylemeniz gerektiği anlamına gelir. .
finddosya adlarının kabuk için uygun bir formatta çıktı alma seçeneği sunması mantıklı olur . Bununla birlikte, genel olarak, -print0GNU finduzantısı diğer birçok senaryo için de iyi çalışır ve bunu her durumda kullanmayı öğrenmelisiniz.
ls $(command...)listeyi beslemiyor stdin. $(command...)Doğrudan çıktısını komut satırına koyar . Bu durumda, $IFSc'den okunan kabuktur ve çıktının nasıl bölüneceğine karar vermek için şu anki değerini kullanır . Genel olarak, kullanmanız daha iyi olur xargs. Bir performans artışı fark etmeyeceksiniz.
find -printf '"%p"\n'bulunan her adın başına çift tırnak ekler, ancak dosya adındaki çift tırnak işaretlerini doğru şekilde tırnak içine almaz. Dosya adlarınızda gömülü çift tırnak işareti yoksa, sorunu yok sayabilirsiniz: veya üzerinden geçebilirsiniz sed 's/"/&&/g;s/^""/"/;s/""$/"/'. Dosya adlarınız kabuk tarafından işleniyorsa, büyük olasılıkla çift tırnak yerine tek tırnak kullanmalısınız (aksi takdirde sweet$HOMEböyle bir şey olur sheet/home/you). Ve bu hala içinde yeni satır bulunan dosya adlarına karşı çok sağlam değil. Bunlarla nasıl başa çıkmak istiyorsun?
-execBayrağın farkındafindmısın? potansiyel olarak bu hatayı hafifletebilir ve-execdiğer komutlara iletmek yerine komutunuzu daha verimli hale getirebilirsiniz . Sadece benim $ .02