find . -type f -print -exec cat {} \; | grep some string
Perintah di atas tidak mencetak path file.
Saya menggunakan: Ubuntu, bash 4
.
ack
untuk menelusuri semua file di bawah direktori saat ini, mungkin memfilter hanya pada tipe file tertentu.
find . -type f -print -exec cat {} \; | grep some string
Perintah di atas tidak mencetak path file.
Saya menggunakan: Ubuntu, bash 4
.
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. 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:
find . -type f -print0 | xargs -0 grep -l "some string"
sed '...' $(find ... | xargs grep -l ...)
saya menggunakan
grep "some string" . -R
dan itu bekerja lebih cepat
ps
Kasus penggunaan yang lebih kompleks
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
Untuk membaca penjelasan param i
grep --help | grep -- -i
-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:
cd /your/folder/
grep -rHino "your string"
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:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
Dan mari kita cari secara rekursif semua file yang berisi string "iptables -P":
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11: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:
-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).
Saya lebih suka
| menemukan file | make grep ont menemukan file | perlihatkan path lengkap file
find / -type f -exec grep 'some string' {} \; -exec echo {} \;
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)
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string