Saya melakukan find
dan kemudian mendapatkan daftar file. Bagaimana cara saya cat
mengirim pipa ke utilitas lain seperti (sehingga kucing menampilkan konten semua file itu) dan pada dasarnya perlu grep
sesuatu dari file-file ini.
Perpipaan ke proses lain (Meskipun ini TIDAK AKAN mencapai apa yang Anda katakan Anda coba lakukan):
command1 | command2
Ini akan mengirim output dari command1 sebagai input dari command2
-exec
pada find
(ini akan melakukan apa yang ingin Anda lakukan - tetapi khusus untuk find
)
find . -name '*.foo' -exec cat {} \;
(Segala sesuatu di antara find
dan -exec
adalah predikat find yang sudah Anda gunakan. {}
Akan mengganti file tertentu yang Anda temukan dalam perintah ( cat {}
dalam hal ini); \;
adalah untuk mengakhiri -exec
perintah.)
mengirim output dari satu proses sebagai argumen baris perintah ke proses lain
command2 `command1`
sebagai contoh:
cat `find . -name '*.foo' -print`
(Perhatikan ini adalah BACK-QUOTES bukan kutipan reguler (di bawah tilde ~ di keyboard saya).) Ini akan mengirimkan output command1
menjadi command2
sebagai argumen baris perintah. Perhatikan bahwa nama file yang mengandung spasi (baris baru, dll) akan dipecah menjadi argumen yang terpisah.
find -name '*.foo' -print
bekerja sangat baik untuk saya ... Terima kasihfind
memungkinkan Anda untuk menulis:, difind . -name '*.foo' -exec cat {} +
mana+
menunjukkan bahwafind
harus mengelompokkan sebanyak mungkin nama file ke dalam satu permintaan perintah tunggal. Ini cukup berguna (ini berkaitan dengan spasi dll dalam nama file tanpa menggunakan-print0
danxargs -0
).find . -name '*.foo' | xargs cat
find . -name '*.foo' | xargs cat | grep string
Versi modern
POSIX 2008 menambahkan
+
penandafind
yang berarti sekarang secara otomatis mengelompokkan file sebanyak yang masuk akal ke dalam satu eksekusi perintah, sangat miripxargs
, tetapi dengan sejumlah keuntungan:Masalah nama file adalah masalah
xargs
tanpa-0
opsi, dan masalah 'run even with zero file names' adalah masalah dengan atau tanpa-0
opsi - tetapi GNUxargs
memiliki-r
atau--no-run-if-empty
opsi untuk mencegah hal itu terjadi. Juga, notasi ini mengurangi jumlah proses, bukan berarti Anda cenderung mengukur perbedaan kinerja. Karenanya, Anda dapat menulis dengan bijaksana:Versi klasik
Jika Anda menggunakan Linux atau memiliki GNU
find
danxargs
perintah, gunakan-print0
denganfind
dan-0
denganxargs
untuk menangani nama file yang berisi spasi dan karakter ganjil lainnya.Tweak hasil dari
grep
Jika Anda tidak ingin nama file (hanya teks) maka tambahkan opsi yang sesuai untuk
grep
(biasanya-h
untuk menekan 'judul'). Untuk benar-benar menjamin nama file dicetak olehgrep
(bahkan jika hanya satu file ditemukan, atau doa terakhirgrep
hanya diberikan 1 nama file), kemudian tambahkan/dev/null
kexargs
baris perintah, sehingga akan selalu ada setidaknya dua nama file.sumber
xargs grep something
.find
disalurkan ke input standarxargs
. Thexargs
program membaca masukan standar, membelah input di ruang putih (kosong, baris baru, tab, dll) dan menambahkan sejumlah kata-kata untuk perintahgrep something
dan mengeksekusi baris perintah.xargs
kemudian melanjutkan membaca input dan mengeksekusi perintah sampai kehabisan input.xargs
menjalankangrep
perintah sesering yang diperlukan untuk input yang diberikan (darifind
dalam contoh ini)./dev/null
kehilangan pesan kesalahan.Ada beberapa cara untuk meneruskan daftar file yang dikembalikan oleh
find
perintah kecat
perintah, meskipun secara teknis tidak semua menggunakan perpipaan, dan tidak ada yang benar-benar disalurkan langsung kecat
.Yang paling sederhana adalah menggunakan backticks (
`
):Ini mengambil output
find
dan secara efektif menempatkannya di baris perintahcat
. Ini tidak berfungsi dengan baik jikafind
memiliki terlalu banyak output (lebih dari yang bisa muat pada baris perintah) atau jika output memiliki karakter khusus (seperti spasi).Dalam beberapa shell, termasuk
bash
, seseorang dapat menggunakan$()
bukannya backticks:Ini kurang portabel, tetapi bisa ditumpuk. Selain itu, ia memiliki banyak peringatan yang sama dengan backticks.
Karena menjalankan perintah lain pada apa yang ditemukan adalah penggunaan umum
find
, find memiliki-exec
tindakan yang mengeksekusi perintah untuk setiap file yang ditemukan:The
{}
adalah sebuah tempat untuk nama file, dan\;
menandai akhir perintah (Ini mungkin untuk memiliki tindakan lain setelah-exec
.)Ini akan berjalan
cat
sekali untuk setiap file tunggal daripada menjalankan satu contohcat
melewati itu beberapa nama file yang bisa tidak efisien dan mungkin tidak memiliki perilaku yang Anda inginkan untuk beberapa perintah (meskipun itu baik untukcat
). Sintaksnya juga canggung untuk mengetik - Anda harus keluar dari titik koma karena titik koma khusus untuk shell!Beberapa versi
find
(terutama versi GNU) memungkinkan Anda mengganti;
dengan+
menggunakan-exec
mode tambahkan untuk menjalankan lebih sedikit contohcat
:Ini akan memberikan beberapa nama file ke setiap permintaan
cat
, yang bisa lebih efisien.Perhatikan bahwa ini tidak dijamin untuk menggunakan doa tunggal. Jika baris perintah terlalu panjang maka argumen tersebar di beberapa permintaan
cat
. Untukcat
ini mungkin bukan masalah besar, tetapi untuk beberapa perintah lain ini dapat mengubah perilaku dengan cara yang tidak diinginkan. Pada sistem Linux, batas panjang baris perintah cukup besar, sehingga pemisahan menjadi beberapa pemanggilan cukup jarang dibandingkan dengan beberapa OS lainnya.Pendekatan klasik / portabel adalah dengan menggunakan
xargs
:xargs
menjalankan perintah yang ditentukan (cat
, dalam kasus ini), dan menambahkan argumen berdasarkan apa yang dibaca dari stdin. Sama seperti-exec
dengan+
, ini akan memecah baris perintah jika perlu. Artinya, jikafind
menghasilkan terlalu banyak output, itu akan berjalancat
beberapa kali. Seperti disebutkan di bagian tentang-exec
sebelumnya, ada beberapa perintah di mana pemisahan ini dapat mengakibatkan perilaku yang berbeda. Perhatikan bahwa menggunakanxargs
seperti ini memiliki masalah dengan spasi dalam nama file, karenaxargs
hanya menggunakan spasi sebagai pembatas.Metode yang paling kuat, portabel, dan efisien juga menggunakan
xargs
:The
-print0
bendera mengatakanfind
untuk menggunakan\0
(null karakter) pembatas antara nama file, dan-0
bendera mengatakanxargs
untuk mengharapkan ini\0
pembatas. Ini memiliki perilaku yang hampir sama dengan pendekatan-exec
...+
, meskipun lebih portabel (tapi sayangnya lebih bertele-tele).sumber
ls
juga.$()
Juga bekerja dengan perintah selainfind
.Untuk mencapai ini (menggunakan bash) saya akan lakukan sebagai berikut:
Ini dikenal sebagai "substitusi perintah" dan strip feed default, yang benar-benar nyaman!
info lebih lanjut di sini
sumber
Kedengarannya seperti pekerjaan untuk skrip shell bagi saya:
atau semacam itu
sumber
Inilah cara saya untuk menemukan nama file yang mengandung beberapa konten yang saya minati, hanya satu baris bash yang dengan baik menangani spasi di nama file juga:
sumber
Saya menggunakan sesuatu seperti ini:
"
-print0
" argumen untuk "find" dan "-0
" argumen untuk "xargs" diperlukan untuk menangani spasi putih di jalur / nama file dengan benar.sumber
Perintah find memiliki argumen -exec yang dapat Anda gunakan untuk hal-hal seperti ini, Anda bisa melakukan grep secara langsung menggunakan itu.
Misalnya ( dari sini, contoh bagus lainnya di halaman ini ):
sumber
Ini foto saya untuk penggunaan umum:
Ini akan mencetak nama file
sumber
Dalam bash, berikut ini akan sesuai:
Ini akan menemukan semua file di
/dir
direktori, dan memasukkan nama filexargs
dengan aman, yang akan dikendarai dengan amangrep
.Melewati
xargs
bukanlah ide yang baik jika Anda memiliki ribuan file/dir
;cat
akan rusak karena panjang daftar argumen yang berlebihan.xargs
akan menyelesaikan semua itu untuk Anda.The
-print0
argumen untukfind
jerat dengan-0
argumen untukxargs
menangani nama file dengan spasi benar. The-i
argumen untukxargs
memungkinkan Anda untuk memasukkan nama file di mana diperlukan dalamcat
baris perintah. Tanda kurung diganti dengan nama file yang disalurkan kecat
perintah darifind
.sumber
Ini bekerja untuk saya
sumber
Gunakan ggrep .
untuk mencari file di unix yang mengandung teks yang terletak di direktori saat ini atau subdirektori
sumber
Ini akan mencetak nama dan isi file-hanya secara rekursif ..
Edit (Versi yang ditingkatkan): Ini akan mencetak nama dan isi file teks (ascii) saja secara rekursif ..
Satu upaya lagi
sumber
Apakah Anda mencoba menemukan teks dalam file? Anda cukup menggunakan grep untuk itu ...
sumber
Untuk membuat daftar dan melihat isi semua file abc.def pada server di direktori / ghi dan / jkl
Untuk membuat daftar file abc.def yang telah mengomentari entri dan tampilan, lihat entri tersebut di direktori / ghi dan / jkl
sumber