Bagaimana cara grep file tersembunyi?

96

Saya mencari melalui repositori Git dan ingin memasukkan .gitfolder tersebut.

grep tidak termasuk folder ini jika saya jalankan

grep -r search *

Apa perintah grep untuk memasukkan folder ini?

Steven Penny
sumber

Jawaban:

136

Silakan merujuk ke solusi di akhir posting ini sebagai alternatif yang lebih baik untuk apa yang Anda lakukan.

Anda dapat secara eksplisit menyertakan file tersembunyi (direktori juga merupakan file).

grep -r search * .*

The *akan cocok dengan semua file kecuali yang tersembunyi dan .*akan cocok hanya file tersembunyi. Namun ini akan gagal jika tidak ada file non-tersembunyi atau tidak ada file tersembunyi di direktori tertentu. Anda tentu saja dapat menambahkan secara eksplisit, .gitbukan .*.

Namun, jika Anda hanya ingin mencari di direktori tertentu, lakukan seperti ini:

grep -r search .

The .akan cocok dengan jalan saat ini, yang akan mencakup non-tersembunyi dan file tersembunyi.

bitmask
sumber
1
Pendekatan pertama (pencarian grep -r *. *) Berhasil untuk saya. Pendekatan kedua (grep -r search.) Tidak menemukan string. Saya menemukan hasil yang serupa ketika menghilangkan "-r" dan hanya mencari direktori level teratas. Saya menggunakan GNU grep 2.6.3.
Alan
@Alan: Itu aneh. Saya menggunakan ini secara teratur. Apakah Anda mencobanya di direktori yang sama?
bitmask
27
menggunakan .*akan menyertakan direktori induk (karena ..cocok)
lihat
1
Apakah aman untuk menggeneralisasi solusi ini karena bahavior dapat bervariasi antar shell?
astletron
6
untuk versi pertama Anda harus menambahkan --exclude-dir = .. untuk menghindari pencarian di folder induk
user762353
12

Saya baru saja mengalami masalah ini, dan berdasarkan jawaban @ bitmask, berikut adalah modifikasi sederhana saya untuk menghindari masalah yang ditunjukkan oleh @sehe:

grep -r search_string * .[^.]*
orang gila
sumber
saya tidak mendapatkan hasil apapun dengan menggunakan ini: sudo grep -r ANDROID_HOME * .[^.]*apa yang saya lakukan salah di sini?
messerbill
@messerbill di mana Anda menjalankan pencarian?
insaner
3

Mungkin Anda lebih suka menggabungkan "grep" dengan perintah "temukan" untuk solusi lengkap seperti:

find . -exec grep -Hn search {} \;

Perintah ini akan mencari di dalam file atau direktori tersembunyi untuk string "pencarian" dan mencantumkan file apa pun yang kebetulan dengan format keluaran ini:

Jalur file: Nomor baris: baris dengan kebetulan

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line
Olvathar
sumber
2

Anda mungkin ingin menggunakan pendekatan ini, dengan asumsi Anda sedang mencari direktori saat ini (jika tidak ganti. Dengan direktori yang diinginkan):

find . -type f | xargs grep search

atau jika Anda hanya ingin mencari di tingkat atas (yang lebih cepat diuji jika Anda mencobanya):

find . -type f -maxdepth 1 | xargs grep search

PEMBARUAN: Saya mengubah contoh sebagai tanggapan atas komentar Scott. Saya juga menambahkan "-type f".

Alan
sumber
1
(1)  ~adalah direktori home pengguna. Pertanyaannya bukan tentang direktori home pengguna, jadi jawabannya tidak boleh disebutkan  ~. (2) Dalam sebuah  findperintah, -name '*'adalah no-op (yaitu, tidak ada gunanya).
Scott
1

Untuk mencari di dalam HANYA semua file dan direktori tersembunyi dari lokasi Anda saat ini:

find . -name ".*" -exec grep -rs search {} \;

HANYA semua file tersembunyi:

find . -name ".*" -type f -exec grep -s search {} \;

HANYA semua direktori tersembunyi:

find . -name ".*" -type d -exec grep -rs search {} \;
Tyler Christian
sumber
1

Semua jawaban lainnya lebih baik. Yang ini mungkin mudah diingat:

find . -type f | xargs grep search

Ia hanya menemukan file (termasuk tersembunyi) dan grep setiap file.

PrashantB
sumber
0

Untuk menemukan hanya dalam folder tertentu, Anda dapat menggunakan:

ls -al | grep " \."

Ini adalah perintah yang sangat sederhana untuk mendaftar dan menyalurkan ke grep.

Peter Mortensen
sumber
0

Selain saran Tyler, Berikut adalah perintah untuk melakukan grep semua file dan folder secara rekursif termasuk file tersembunyi

find . -name "*.*" -exec grep -li 'search' {} \;
nikhilgoel1985
sumber
0

Untuk mencegah pencocokan .dan ..yang bukan merupakan file tersembunyi, Anda dapat menggunakan grepdengan ls -Aseperti dalam contoh ini:

ls -A | grep "^\."

^\. menyatakan bahwa karakter pertama harus .

The -Aatau --almost-allopsi tidak termasuk hasil .dan ..sehingga hanya file tersembunyi dan direktori dicocokkan.

mchid
sumber
0

Anda juga dapat mencari jenis file tersembunyi tertentu seperti untuk file direktori tersembunyi:

grep -r --include=*.directory "search-string"

Ini mungkin bekerja lebih baik daripada beberapa opsi lainnya. Opsi lain yang berfungsi bisa jadi terlalu lambat.

mYnDstrEAm
sumber