Borulu xargs sonrası pipo komutları


38

HP-UX ***** B.11.23 Kullanıcı Kılavuzu i643 sınırsız kullanıcı lisansı

find . -type d -name *log* | xargs ls -la

bana dizin isimlerini (dizin ismini içerenler log) ve ardından bu dizin içindeki tüm dosyaları verir.

Dizinleri  /var/opt/SID/application_a/log/,  /var/opt/SID/application_b/log/,  /var/opt/SID/application_c/log/ve benzeri günlük dosyalarını içerir.

Yalnızca en son iki günlük dosyasının lsgenellikle kullandığım komutla listelenmesini istiyorum ls -latr | tail -2.

Çıktı böyle bir şey olmalı ..

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2

find . -type d -name *log* | xargs ls -la | tail -2bana yukarıdaki sonucu vermiyor. Elde ettiğim son iki find . -type d -name *log* | xargs ls -lakomut dosyasının listesi .

Bir borudan sonra komutları yönlendirebilir xargsmiyim? Ortaya çıkan dosyaların listesini yukarıdaki biçimde almak için başka nasıl sorgulayabilirim?

find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"

bana şu anki dizinde bulunan /var/opt/SIDve içinde istediğim de olmayan 10 dizin adının bir listesini verir .


2
Sen anlatmalısın *log*kabuk genişletmek aksi takdirde.
Anthon

sh -cKomut adını (parametre 0) ikinci argüman olarak beklediğinin farkında olun , bu yüzden her zaman yapmanız gerekir find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail( lstailen sonunda, $0oluşturulan kabuktaki gibi hizmet edecek ) dikkat edin. Aksi takdirde sonuçlarınızdan ilki bu rolü dolduracak ve kullanılmayacaktır.
Jonas

Yanıtlar:


57

Neredeyse oradasın. Son komutunuzda doğru işlemi -Iyapmak için kullanabilirsiniz .ls

-I replace-str

    Alternate -str oluşumunu ilk argümanlarda standart girdiden okunan isimlerle değiştirin . Ayrıca, işaretlenmemiş boşluklar girdi öğelerini sonlandırmaz; bunun yerine ayırıcı yeni satır karakteridir. İma -xve -L 1.

Böylece

find . -type d -name "*log*" | xargs -I {} sh -c "echo {}; ls -la {} | tail -2"

Eğer olur echotarafından bulunan dir find, daha sonra bunu ls | tailüzerine.


Bul türü d-name " log " | xargs -I {} sh -c "echo {}; ls -ltr {} | grep -E \" file_in | file_out \ "| tail -5" Bunu kullandım.
başka bir kişi1

3
Yaparımxargs -n 1 sh -c 'echo $0'
Ginhing 3

1
macOS'ta değiştirme işlemi alıntı komutunda çalışmadı, bu yüzden yardımcı echo $0oldu (ve daha anlaşılır)
mpuncel

1
Boşluklara, kullanımı ile dosya adları ile çalışmak yapmak için -print0, xargs -0ve kaçış {}çift tırnak içine sh komutu:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
Benedikt Köppel

"Xargs -n 1 sh -c" kullanıyorum echo \ $ 0 | $ func "` $ func değişkenini kullanmam gerekiyorsa
tanrı


2

Sadece fredtantini'ye ek olarak ve genel bir açıklama olarak (doktorlar biraz kafa karıştırıcı olduğu için):

xargs -I {}Standart girişten '{}' karakterleri alıp borusundan geliyor ne olursa olsun bunların yerine edecektir. Bu, aslında {}herhangi bir karakter kombinasyonuyla değiştirebileceğiniz anlamına gelir (belki de tercih ettiğiniz programlama tadını daha iyi ayarlamak için). Örneğin : xargs -I % sh -c "echo %". Her zaman kullanırsanız , stenoyu olduğu gibi xargs -I {}değiştirebilirsiniz xargs -i.

sh -cBir dizeden değil standart girişten sonraki komutu okumak için kabuk / sizin bash söyleyecektir. Yani yazmak sh -c "echo something"eşittir echo something.

xargs -I {} sh -c "echo {}"İle oluşturduğunuz giriş okuyacaktır sh -changi echo {}. {}Borudan aldığın argümanlarla değiştirmesini söylediğinden beri , bu olacak.

Bunu boru olmadan bile kolayca test edebilirsiniz, sadece yukarıdaki komutu bir terminale yazın. Bundan sonra ne yazarsanız terminale yönlendirilirsiniz (Ctrl-D çıkmak için).

Komutta ls -la {}aynı şey tekrar olur. Bu {}, pre-pipe komutunun içeriğiyle değiştirilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.