"Grep -r foo *" vs "grep -r foo."


10

Saat menggunakan grep -r Anda dapat mencari di semua file dengan * atau. dan tampaknya mengembalikan hal yang sama tetapi apakah itu benar-benar sama?

Katakanlah saya mencari "foo", maka saya bisa menulis

grep -r foo *

atau

grep -r foo .

Adakah yang akan mencoba menjelaskan perbedaan antara. dan *?

Jawaban:


15

grep -r foo *tidak mencari kecocokan dalam file atau direktori tersembunyi, juga *diperluas oleh shell sehingga Anda mungkin berakhir dengan daftar argumen Kesalahan terlalu lama ketika ada banyak entri dalam direktori saat ini, atau beberapa kesalahan atau perilaku lain jika nama beberapa file atau direktori dimulai dengan karakter tanda hubung.

Doa grep -r foo .tidak memiliki kelemahan di atas

Diperbarui:

Perbedaan lain: halaman manual grep (@ fedora17) mengatakan:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

Akan ada juga perbedaan ketika Anda menjalankan perintah ini di direktori kosong:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$

4

Jika Anda menggunakan tanda bintang, Anda tidak dapat mencocokkan file dalam direktori yang namanya dimulai dengan titik, seperti .cache.

Memperbarui:

Ini karena *diperluas oleh shell sebelum memanggil grep, sehingga menerima daftar nama bukan nama direktori tunggal (untuk saat ini .). Cara shell memperluas pola dapat dikustomisasi dengan parameter shell (seperti untuk nullglob, nocaseglobatau bashopsi lain ) atau menjadi variabel lingkungan (seperti LANGatau LC_ALL)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.