HP-UX ***** B.11.23 U ia64 **** lisensi pengguna tidak terbatas
find . -type d -name *log* | xargs ls -la
memberi saya nama direktori (yang berisi log
nama direktori) diikuti oleh semua file dalam direktori itu.
Direktori /var/opt/SID/application_a/log/
, /var/opt/SID/application_b/log/
, /var/opt/SID/application_c/log/
dan sebagainya berisi file-file log.
Saya ingin hanya dua file log terbaru yang didaftar oleh ls
perintah, yang biasanya saya temukan menggunakan ls -latr | tail -2
.
Outputnya harus seperti ini ..
/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 -2
tidak memberi saya hasil di atas. Yang saya dapatkan adalah daftar dua file
find . -type d -name *log* | xargs ls -la
perintah terakhir.
Jadi bisakah saya memipakan perintah setelah dipipet xargs
? Bagaimana lagi saya meminta, untuk mendapatkan daftar file yang dihasilkan dalam format di atas?
find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"
memberi saya daftar nama direktori sepuluh di dalam direktori saat ini yang kebetulan /var/opt/SID
dan itu juga bukan yang saya inginkan.
*log*
jika tidak, shell akan mengembangkannya.sh -c
mengharapkan nama perintah (parameter 0) sebagai argumen kedua, jadi Anda harus selalu melakukannyafind . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail
(perhatikanlstail
pada bagian akhir, yang akan berfungsi seperti$0
untuk shell yang dibuat). Kalau tidak, hasil pertama Anda akan mengisi peran itu dan tidak digunakan.Jawaban:
Anda hampir sampai. Dalam perintah terakhir Anda, Anda dapat menggunakannya
-I
untuk melakukan yangls
benarJadi, dengan
Anda akan
echo
dir ditemukan olehfind
, kemudian lakukanls | tail
di atasnya.sumber
xargs -n 1 sh -c 'echo $0'
echo $0
sangat membantu (dan lebih dimengerti)-print0
,xargs -0
dan melarikan diri{}
ke tanda kutip ganda di dalamsh
perintah:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
GNU Parallel memudahkan tugas semacam ini:
Jika Anda tidak ingin menginstal GNU Parallel sepenuhnya, Anda dapat melakukan instalasi minimal: http://git.savannah.gnu.org/cgit/parallel.git/tree/README
sumber
Hanya sebagai tambahan fredtantini dan sebagai klarifikasi umum (karena dokumennya agak membingungkan):
The
xargs -I {}
akan mengambil '{}' karakter dari input standar dan menggantinya dengan apa pun yang datang di dari pipa. Ini berarti Anda dapat benar-benar mengganti{}
dengan kombinasi karakter apa saja (mungkin untuk menyesuaikan selera pemrograman pilihan Anda dengan lebih baik). Sebagai contoh :xargs -I % sh -c "echo %"
. Jika Anda selalu menggunakan,xargs -I {}
Anda bisa menggantinyaxargs -i
karena itu adalah singkatan.The
sh -c
akan memberitahu pesta Anda / shell untuk membaca perintah berikutnya dari string dan bukan dari standard input. Jadi menulissh -c "echo something"
setara denganecho something
.The
xargs -I {} sh -c "echo {}"
akan membaca masukan Anda buat dengansh -c
yangecho {}
. Karena Anda mengatakannya untuk mengganti{}
dengan argumen yang Anda dapatkan dari pipa, itulah yang akan terjadi.Anda dapat dengan mudah menguji ini bahkan tanpa pemipaan, cukup ketikkan perintah di atas dalam terminal. Apa pun yang Anda tulis selanjutnya akan dikeluarkan ke terminal (Ctrl-D untuk keluar).
Dalam
ls -la {}
perintah itu hal yang sama terjadi lagi. The{}
diganti dengan isi perintah pra-pipa.sumber