Temukan perintah: bagaimana cara mengabaikan kasus?

171

Saya mencari file "WSFY321.c" dalam hierarki direktori besar.
Biasanya saya akan menggunakan GNU find : find . -name "WSFY321.c"
Tapi saya tidak tahu kasusnya, bisa jadi huruf besar, huruf kecil, atau campuran keduanya.

Apa cara termudah untuk menemukan file ini?
Adakah sesuatu yang lebih baik dari itu find . | grep -i "WSFY321.c"?

Nicolas Raoul
sumber

Jawaban:

216

Versi terbaru dari GNU findmemiliki -inamebendera, untuk pencarian nama yang case-sensitive.

find . -iname "WSFY321.c"
Lars Rohrbach
sumber
6
Juga, karena Anda secara khusus mencari file, Anda mungkin dapat mencukur beberapa tanda centang dengan -type ftanda tersebut sehingga tidak akan repot melihat nama jika inode adalah direktori. Tapi itu tingkat optimasi yang luar biasa ...
Shadur
Untuk bekerja dengan beberapa regex dapat Anda lakukanfind . -iname \*WSFY321.c\* -type f
Benj
40

Dengan GNU find, atau versi lain dari find yang memilikinya:

find . -iname 'WSFY321.c'

Dengan versi lain:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

Atau kompromi yang lebih lambat tetapi lebih mudah untuk mengetik:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

Atau dalam zsh:

print -rl -- **/(#i)WSFY321.c
Gilles
sumber
@Gilles The grepversi penyaringan hanya huruf, dan saya tidak mengerti '[^ /]' .. (tidak /)
Peter.O
@Gilles Apa argumen untuk menggunakan tanda kutip tunggal dalam kasus pertama (nama file yang tepat) tanpa tanda kutip sama sekali?
Bernhard
@ Peter.O Tidak *setelah /versi bash. Maksud saya grep -i. Saya menggunakan [^/]*daripada .*agar tidak menangkap file dalam direktori yang namanya dimulai dengan WSFY.
Gilles
5
@Bernhard Consistency.
Gilles
Terima kasih Gilles: Saya menghapus komentar sebelumnya dengan sintaks yang salah, dan menguji versi yang diubah, tetapi tidak berfungsi tanpa * (untuk alasan yang tidak terduga; setidaknya untuk saya). Kasus-insensitive pilihan tidak lagi bekerja: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... Saya kira itu sebabnya itu disebut nocase gumpal : hanya bekerja dalam konteks gumpal (atau begitu tampaknya).
Peter.O
1

Dua solusi untuk macOS:

Menggunakan GNU find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

Menggunakan GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"
Drew Beres
sumber
1
Pada macOS Sierra opsi -iname tersedia secara default.
ThomasW