Mungkin itu tidak memenuhi hasil yang Anda harapkan karena filter grep. Bagaimana dengan ini:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex
Apa tujuan yang ingin Anda capai? Pada output Anda mendapatkan string yang diambil dari file, Anda ingin path dari file-file itu?
mirkobrankovic
Ya saya ingin mencetak path file yang berisi string 'some string'. Saran @artistoex mencetak semua jalur file.
H.Rabiee
Anda mungkin hanya ingin menggunakan ackuntuk menelusuri semua file di bawah direktori saat ini, mungkin memfilter hanya pada tipe file tertentu.
Jaap Eldering
Jawaban:
87
Itu karena Anda memberi makan grepaliran teks yang kebetulan berisi nama file. Karena Anda tidak memberikan nama file sebagai argumen untuk di-grep, tidak dapat diharapkan untuk menyimpulkan dari file mana baris yang cocok berasal. Gunakan xargs:
find .-type f -print | xargs grep "some string"
Karena Anda memiliki GNU find / xargs, ini adalah cara yang lebih aman bagi xargs untuk membaca nama file:
find .-type f -print0 | xargs -0 grep "some string"
Jika Anda hanya ingin nama file yang memiliki baris yang cocok tanpa menunjukkan baris yang cocok:
Seperti yang Anda lihat di output, kami memiliki nama file: hit baris: string yang dicari
Berikut deskripsi yang lebih rinci tentang parameter yang digunakan:
-r Untuk setiap operan direktori, baca dan proses semua file dalam direktori itu, secara rekursif. Ikuti tautan simbolis pada baris perintah, tetapi lewati symlink yang ditemui secara rekursif. Perhatikan bahwa jika tidak ada operan file yang diberikan, grep mencari direktori yang berfungsi. Ini sama dengan opsi '--directories = recurse'.
-i Cetak nama file untuk setiap pertandingan. Ini adalah default ketika ada lebih dari satu file untuk dicari.
-n Awali setiap baris output dengan nomor baris berbasis 1 dalam file inputnya. (-n ditentukan oleh POSIX.)
-H Cetak nama file untuk setiap pertandingan. Ini adalah default ketika ada lebih dari satu file untuk dicari.
-o Cetak hanya bagian yang cocok (tidak kosong) dari garis yang cocok, dengan masing-masing bagian tersebut pada jalur output terpisah. Baris output menggunakan pembatas yang sama dengan input, dan pembatas adalah byte nol jika -z (--null-data) juga digunakan (lihat Opsi Lain).
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
ack
untuk menelusuri semua file di bawah direktori saat ini, mungkin memfilter hanya pada tipe file tertentu.Jawaban:
Itu karena Anda memberi makan
grep
aliran teks yang kebetulan berisi nama file. Karena Anda tidak memberikan nama file sebagai argumen untuk di-grep, tidak dapat diharapkan untuk menyimpulkan dari file mana baris yang cocok berasal. Gunakanxargs
:Karena Anda memiliki GNU find / xargs, ini adalah cara yang lebih aman bagi xargs untuk membaca nama file:
Jika Anda hanya ingin nama file yang memiliki baris yang cocok tanpa menunjukkan baris yang cocok:
sumber
sed '...' $(find ... | xargs grep -l ...)
saya menggunakan
dan itu bekerja lebih cepat
ps
Kasus penggunaan yang lebih kompleks
Untuk membaca penjelasan param i
sumber
-n
jika Anda ingin nomor baris. +1 untuk jawaban yang disederhanakan.Saya sering mencari kode sumber dalam struktur folder yang kompleks dan saya merasa berguna menggunakan:
Dengan parameter-parameter itu, tanpa menggunakan find , saya mendapatkan path file lengkap dan nomor baris yang berisi string yang ditentukan .
Ini juga mudah diingat karena BASH melalui pencarian Anda seperti badak :)
Saya akan menunjukkan bagaimana ini bekerja dengan contoh cepat.
Mari kita tampilkan konten file menggunakan cat:
Dan mari kita cari secara rekursif semua file yang berisi string "iptables -P":
Seperti yang Anda lihat di output, kami memiliki nama file: hit baris: string yang dicari
Berikut deskripsi yang lebih rinci tentang parameter yang digunakan:
sumber
Saya lebih suka
| menemukan file | make grep ont menemukan file | perlihatkan path lengkap file
find / -type f -exec grep 'some string' {} \; -exec echo {} \;
sumber
Silver Searcher adalah utilitas yang sangat cepat dan praktis untuk mencari file dan konten.
Untuk mengatasi masalah Anda, perintah pencari perak akan terlihat seperti ini ...
ag 'some string' -l
-l
Hanya cetak nama file yang mengandung yang cocok (jangan cetak baris yang cocok)sumber