Saya ingin mencari string teks di semua file dalam direktori (dan bukan subdirektori-nya; Saya tahu -r
opsi melakukan itu, tetapi bukan itu yang saya inginkan).
Lari
grep "string" /path/to/dir
seharusnya bisa melakukan ini, saya sudah baca, tapi itu memberi saya kesalahan:
grep: dir: Adalah direktori
Selanjutnya, saya mencoba menjalankan
grep
beberapa file.grep "string" .bashrc .bash_aliases
bekerja dengan sempurna.grep "string" .bash*
berfungsi sebagaimana dimaksud juga.grep "string" *
memberi saya kesalahan:grep: data: Is a directory grep: Desktop: Is a directory grep: Documents: Is a directory grep: Downloads: Is a directory ...
Hanya kesalahan yang dicetak, saya tidak mendapatkan garis yang cocok. Saya mencoba menggunakan -s
opsi, tetapi tidak berhasil.
Jadi, pertanyaan saya:
Mengapa saya tidak bisa menggunakan
grep
direktori, seperti pada (1), padahal seharusnya saya bisa? Saya telah melihat hal itu dilakukan dalam banyak contoh di Internet.
Sunting : Ketika saya mengatakan "menggunakan grep pada direktori", maksud saya "cari di semua file dalam direktori tersebut tidak termasuk subdirektori". Saya percaya bahwa inilah yang dilakukan grep ketika Anda melewatkan direktori untuk menggantikan file. Apakah saya salah?Tolong beri saya penjelasan tentang cara kerjanya
grep
yang akan menjelaskan perilaku perintah di (2).
Sunting : Biarkan saya lebih spesifik. Mengapa menggunakan wildcard untuk menentukan beberapa file untuk mencari bekerja dengan.bash*
dan tidak dengan*
atau bahkan./*
?Bagaimana saya bisa mencari semua file dalam direktori (dan bukan subdirektori) menggunakan
grep
?
*
, yang dikenal sebagai globbing. Globbing tidak termasuk nama file yang dimulai dengan titik seperti.bashrc
standar. Anda dapat mengatur opsi shell sehingga akan menyertakan file-file ini, tetapi Anda dapat membuat diri Anda sedikit berantakan jika Anda tidak tahu apa yang Anda lakukan. Panduan yang bagus untuk memahami globing dapat ditemukan di sini mywiki.wooledge.org/globgrep "string" .bash*
.grep "string" * .* 2>/dev/null
ataugrep -s "string" * .*
Jawaban:
Di Bash, sebuah glob tidak akan berkembang menjadi file tersembunyi, jadi jika Anda ingin mencari semua file dalam direktori, Anda perlu menentukan file yang tersembunyi
.*
dan yang tidak tersembunyi*
.Untuk menghindari kesalahan "Apakah direktori", Anda dapat menggunakan
-d skip
, tetapi pada sistem saya, saya juga mendapatkan kesalahangrep: .gvfs: Permission denied
† , jadi saya sarankan menggunakan-s
, yang menyembunyikan semua pesan kesalahan.Jadi perintah yang Anda cari adalah:
Jika Anda mencari file di dir lain:
Opsi lain adalah menggunakan
dotglob
opsi shell, yang akan membuat glob menyertakan file-file tersembunyi.Untuk file dalam direktori lain:
† Seseorang mengatakan bahwa saya seharusnya tidak mendapatkan kesalahan ini. Mereka mungkin benar - saya membaca tetapi tidak bisa membuat kepala atau ekor sendiri.
sumber
*
dan.*
?echo * .*
danecho *.*
jalankan di direktori home Anda, dan perbedaannya harus jelas. Kalau tidak, LMK dan saya akan menjelaskannya.echo *
menampilkan file dan folder yangecho *.*
tidak tersembunyi,echo .*
menampilkan file yang tidak tersembunyi, menampilkan semua file, danecho * .*
menampilkan semua file dan direktori. Tapi mengapa alasan ruang antara keduanya dalam kasus terakhir? Rasanya berantakan bagi saya. Apakah tidak ada cara untuk menggabungkan keduanya untuk mendapatkan hasil yang sama? Atau sebaliknya apakah ada penjelasan sintaksis mengapa keduanya harus dipisahkan di sini, atau ada* .*
kasus luar biasa?*
merupakan semua file yang tidak disembunyikan (yaitu nama file yang tidak dimulai dengan titik);.*
mewakili semua file yang tersembunyi (yaitu nama file yang tidak dimulai dengan titik); dan*.*
mewakili semua file yang tidak disembunyikan yang mengandung titik. Dalamecho * .*
, kedua gumpalan harus terpisah karena mereka gumpalan yang berbeda: satu untuk non-tersembunyi, satu untuk tersembunyi. Meskipun seperti yang saya tulis dalam jawaban saya, Anda dapat*
memasukkan file tersembunyi dengan mengaktifkandotglob
opsi shell.*.*
umum pada Windows (DOS) sebagai cara untuk membuat daftar semua file tetapi pada * nix hanya akan menyertakan file dengan titik di dalamnya, sehingga tidak masuk akal pada * nix. Alih-alih Anda gunakan*
untuk mendaftar semua file kecuali file tersembunyi, dan.*
untuk daftar file tersembunyi.Anda perlu
-d skip
opsi ditambahkan.Grep mencari di dalam file. Anda dapat mencari secara rekursif, seperti yang Anda katakan, jika Anda ingin mencari file di dalam direktori.
Secara default, grep akan membaca semua file, dan mendeteksi direktori. Karena secara default Anda belum menentukan apa yang harus dilakukan dengan direktori dengan
-d
opsi, itu memberikan output kesalahan.Mencari tepat di dalam direktori induk adalah `grep -d lewati" string "./*
sumber
man grep
.-d skip
tidak bekerja; pada dasarnya sama dengan-s
; juga, lihat hasil edit. (c) Tidak,grep -d skip "string" ./*
juga tidak berfungsi.Penghitung waktu lama mungkin akan melakukan ini:
sumber
find . -type f -exec grep string {} +
?-maxdepth 1
.find . -type f -maxdepth 1 -exec grep string /dev/null {} +
-H
untuk grep.Penguraian ulang - Anda ingin mengambil file dalam satu tingkat subdirektori, tetapi tidak muncul kembali melalui semua sub-direktori?
Atau jika Anda tidak ingin file di direktori saat ini
Perhatikan ini tidak akan menemukan direktori yang dimulai dengan titik.
harus melakukan pekerjaan itu.
Ada juga
-maxdepth
dan-mindepth
batasan parameter yang tersedia untukfind
perintah juga.sumber
grep forthis */*
mencari file di direktori saat ini dan satu direktori di bawah?*/*
hanya cocok dengan satu tebasan. Jika Anda memiliki file bernamaa/b
di direktori saat ini maka `* / * akan cocok dengan itu.Berikut adalah contoh untuk melewati direktori tanpa melewatkan semua kesalahan:
sumber