2016-03-26 26 views
1

O/S = RHEL 7.2Çalışmıyor: find -print0 | xargs -0 bash -c "...."

beklediğiniz gibi, dbg baskı altında ilk iki satır"' derhal/home/mydir altındaki tüm dosyaları takip eder. Ama ikinci iki satırda gösterildiği gibi -print0 ve xargs -0 kullanırsam, dizindeki ilk dosya atlanır. Ekoyu echo dbg "$ 0" $ @ " olarak değiştirmeyi denedim. alt dizindeki dosyalar. Boş bir alt dizinde, 0 $ "bash" değerini döndürür. Eğer bash -c 'command' arg0 arg1 arg2 … kullandığınızda

# This works 
dir=/home/mydir 
find "$dir" -maxdepth 1 -type f -print | xargs bash -c '/bin/echo dbg "[email protected]"' 

# This skips the first file 
dir=/home/mydir 
find "$dir" -maxdepth 1 -type f -print0 | xargs -0 bash -c '/bin/echo dbg "[email protected]"' 
+0

İşleri aynen beklendiği (Linux Mint 17.3, GNU bash, versiyon 4.3.11 (1) -salınımı (x86_64-sitenizin PC gibi linux-gnu)). Her iki çizgi de aynı çıktıyı verir. – cwschmidt

+0

Yararlı bilgi. RHEL 7.2'de test yapıyorum. Soruyu, benim gördüğüm gerçek davranışla ilgili bazı düzeltmelerle birlikte içerecek şekilde düzenledim. –

+0

'xargs':' '' $ dir '' -maxdepth 1 -type f -exec bash -c '/ bin/echo dbg "$ @"' _ {} \; 'dizinine ihtiyacınız yoktur. Aslında, "bash" 'a bile ihtiyacınız yok: '' $ dir' '-maxdepth 1 -type f -exec/bin/echo dbg {} \; ' –

cevap

3

, arg0 olarak temsil argüman $0 olarak kabul edilir, senaryonun adı (ve "[email protected]" parçası değil, bu nedenle).

Sen ile göstermek olabilir:

$ bash -c 'echo dbg "[email protected]"' a b c 
dbg b c 
$ bash -c 'echo dbg "[email protected]"' name a b c 
dbg a b c 
$ bash -c 'echo dbg [$0] "[email protected]"' name a b c 
dbg [name] a b c 
$ 

Kullanım:

find "$dir" -maxdepth 1 -type f -print0 | xargs -0 bash -c '/bin/echo dbg "[email protected]"' name 
+0

Teşekkür ederim; Böyle bir şeye geliyordum; Sonunda başka bir yerde bahsettiğim yer tutucunun kullanımını anlıyorum. -print ve -print0 kullanımı arasındaki farklardan dolayı hala kafam karıştı, ama her şey işe yaradığında, bunu tekrar gözden geçireceğim. İlginç bir şey öğrenirsem, burada yayınlayacağım. –

+0

'-print0' ve' -0' yararını görmek için, boşluklu veya onlarla benzer dosya adlarına sahip olmanız ve argüman sınırlarını doğru bir şekilde algılamanın bir yolu ('" $ @ ''); Cevap, ama 'yankı' muhtemelen değil, belki 'printf' kullanın [echo 'yerine [% s] \ n "'). Benzer şekilde, yeni satırları, sekmeleri ve diğer garip-top karakterlerini içeren dosya adlarıyla. –

+0

Açıklama için teşekkürler - ama sanırım net değildim. -print ve -print0'ın farklı davrandığı orijinal sorun bildirisine başvurdum. Ya temel bir şeyi anlayamıyorum ya da testlerimde temel bir hata yaptım. (Geri dönene ve her şeyi tekrar test edene kadar ikinciyi indiremiyorum. Ne olduğunu anlamadığımdan beri, sınavımda aptalca bir şey yapmadığımı söyleyemem.) –