Bagaimana cara menggunakan perintah "cat" pada output perintah "find"?

13

Saya ingin mengarahkan output dari findperintah ke catperintah sehingga saya dapat mencetak data dari file yang diberikan.

Jadi misalnya jika output dari find /aFile/readmemaka kucing harus diartikan sebagai cat ./aFile/readme. Bagaimana saya bisa melakukan itu secara instan?

Apakah saya harus menggunakan pipa?

Saya mencoba versi ini:

cat | find ./inhere -size 1033c 2> /dev/null

Tapi saya kira ini sepenuhnya salah? Tentu saja saya yakin bahwa outputnya hanya satu file dan bukan banyak file.

Jadi bagaimana saya bisa melakukan itu? Saya telah mencari di Google dan tidak dapat menemukan solusi, mungkin karena saya tidak mencari dengan benar: P.

Eksapsy
sumber

Jawaban:

21

Anda dapat melakukan ini dengan findsendirian menggunakan -exectindakan:

find /location -size 1033c -exec cat {} +

{}akan diperluas ke file yang ditemukan dan +akan memungkinkan kita membaca argumen sebanyak mungkin per doa cat, karena kucing dapat mengambil banyak argumen.

Jika Anda findtidak memiliki +ekstensi atau Anda ingin membaca file satu per satu:

find /location -size 1033c -exec cat {} \;

Jika Anda ingin menggunakan opsi apa pun cat, lakukan:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Di sini saya menggunakan -nopsi untuk mendapatkan nomor baris.

heemayl
sumber
Jadi, jika saya benar: {} seperti variabel yang di dalamnya tersimpan output dari perintah find dan setelah tanda "+" Anda seharusnya menulis parameter cat? Tidak ? Sunting: Baiklah Anda mengedit posting Anda dan sekarang Anda baru saja menjawab pertanyaan saya: P Thanx man! Terpecahkan !
Eksapsy
@ general656 Periksa hasil edit saya ..
heemayl
1
Fakta bahwa saya tidak tahu tentang cat's -npilihan mengejutkan saya. Saya suka membaca pertanyaan acak.
mazunki
0

Substitusi Perintah

Pilihan lain adalah dengan menggunakan Substitusi Perintah . Membungkus perintah $()akan menjalankan perintah dan mengganti perintah dengan outputnya.

cat $(find ./inhere -size 1033c 2> /dev/null)

akan menjadi

cat ./inhere/file1 .inhere/file3

Ini kurang lebih setara dengan menggunakan gaya pembungkus yang lebih tua dengan kutu belakang:

cat `find ./inhere -size 1033c 2> /dev/null`

Lebih detail dari dokumen yang ditautkan di atas

Bash melakukan ekspansi dengan mengeksekusi perintah di lingkungan subkulit dan mengganti substitusi perintah dengan output standar dari perintah, dengan setiap baris baru yang tertinggal dihapus. Baris baru yang disematkan tidak dihapus, tetapi mereka dapat dihapus selama pemisahan kata. Substitusi perintah $(cat file)dapat diganti dengan yang setara tetapi lebih cepat $(< file).

Ketika bentuk backquote gaya lama substitusi yang digunakan, backslash mempertahankan arti harfiahnya kecuali jika diikuti oleh $, `atau \. Backquote pertama yang tidak diawali dengan backslash mengakhiri substitusi perintah. Saat menggunakan $(command)formulir, semua karakter di antara tanda kurung membuat perintah; tidak ada yang diperlakukan secara khusus.

Pergantian perintah dapat disarangkan. Untuk bersarang saat menggunakan formulir backquoted, lepas backquotes dalam dengan backslash.

Jika substitusi muncul dalam tanda kutip ganda, pemisahan kata dan ekspansi nama file tidak dilakukan pada hasil.

Lihat jawaban lain ini untuk beberapa contoh penggunaan yang baik.

WhiteHotLoveTiger
sumber
Perhatikan bahwa jika findmenemukan terlalu banyak file, ini akan menghasilkan galat "daftar argumen terlalu panjang" ketika mencoba memohon cat. Itu juga akan memiliki masalah menangani nama file yang mengandung karakter spasi dan mungkin juga nama file yang mengandung karakter nama globbing.
Kusalananda
-1

Ini akan mencetak nama dan isi file teks (ascii) saja secara rekursif ..

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Satu upaya lagi

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
Prashant Adlinge
sumber
-2

Gunakan pipa dan xarg

find /* -name pg_hba.conf | xargs cat

Jika gagal karena kurangnya izin, Anda dapat menggunakan sudo untuk memastikan Anda memiliki izin untuk mengeksekusi perintah find pada direktori yang Anda cari.

 sudo find /* -name pg_hba.conf | xargs sudo cat
Aplikasi Kerja
sumber
1
Dan jika seseorang telah membuat file bernama /tmp/ /dev/urandom /pg_hba.conf, itu akan membiarkan root membuang seluruh konten /dev/urandom. Lebih buruk mungkin bisa dilakukan tergantung pada konteksnya. xargsseharusnya hampir tidak pernah digunakan tanpa -0jika sama sekali. Juga sudo xargsakan lebih baik daripada xargs sudo. Dan /*akan lebih baik /.
Stéphane Chazelas
1
OP ingin menggunakan cat untuk mencetak konten file di stdout. Jadi tujuannya dilayani oleh kucing. Pertanyaannya adalah bagaimana menggunakan cat dari perintah put out of find untuk mencetak konten file bukan cara menggunakan sudo atau find, Perintah di atas memecahkan pertanyaan. Ya xargs -0 adalah satu-satunya hal konstruktif yang Anda tunjuk. Namun tidak menunjukkan penggunaannya. Usahakan untuk tidak bersikap kasar.
Aplikasi Kerja
Maaf jika itu tampak kasar. Bukan itu maksudnya. Saya ingin menunjukkan batasannya. Jawaban Anda menunjukkan praktik buruk ( find|xargstanpa -0harus benar-benar dilarang), karenanya suara turun. Output dari findtanpa -print0post-processable dapat diandalkan. -print0tidak standar. Karena itu, standar sudo find / -name pg_hba.conf -exec cat {} +juga dapat membuat Anda membuang konten /dev/urandom(misalnya jika seseorang membuat symlink /tmp/pg_hba.confdarinya dan tidak ada cara portabel yang mudah yang tidak setidaknya memiliki kondisi balapan).
Stéphane Chazelas
1
Mari kita tidak menggunakan sudo"berjaga-jaga", oke?
lindhe
Yah, ini lebih baik daripada berlarisudo rm -rf /
devinbost