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
find
Doğ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 find
böylece dosya adları dizesini doğrudan başka bir programa boru olabilir.
find
dosya 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. .
find
dosya adlarının kabuk için uygun bir formatta çıktı alma seçeneği sunması mantıklı olur . Bununla birlikte, genel olarak, -print0
GNU find
uzantı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, $IFS
c'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$HOME
bö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?
-exec
Bayrağın farkındafind
mısın? potansiyel olarak bu hatayı hafifletebilir ve-exec
diğer komutlara iletmek yerine komutunuzu daha verimli hale getirebilirsiniz . Sadece benim $ .02