Temukan semua file dengan nama yang berisi string

177

Saya telah mencari perintah yang akan mengembalikan file dari direktori saat ini yang berisi string dalam nama file. Saya telah melihat locatedan findperintah yang dapat menemukan file dimulai dengan sesuatu first_word*atau diakhiri dengan sesuatu *.jpg.

Bagaimana saya bisa mengembalikan daftar file yang berisi string dalam nama file?

Misalnya, jika 2012-06-04-touch-multiple-files-in-linux.markdownfile dalam direktori saat ini.

Bagaimana saya bisa mengembalikan file ini dan lainnya yang berisi string touch? Menggunakan perintah sepertifind '/touch/'

Dru
sumber
pertanyaannya membingungkan. Anda ingin mencari file yang berisi string, atau file yang namanya mengandung kata string? pertanyaan pertama dijawab dengan man grep, pertanyaan kedua dengan man find. mengapa Anda google daripada menggunakan pria, saya tidak tahu.
hanya seseorang
1
Terima kasih! Kalimat pertama tidak menentukan apakah itu isi file atau nama file. Diperbarui.
Dru

Jawaban:

303

Gunakan find:

find . -maxdepth 1 -name "*string*" -print

Ini akan menemukan semua file di direktori saat ini (hapus maxdepth 1 jika Anda menginginkannya bersifat rekursif) yang berisi "string" dan akan mencetaknya di layar.

Jika Anda ingin menghindari file yang mengandung ':', Anda dapat mengetik:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

Jika Anda ingin menggunakan grep(tapi saya pikir itu tidak perlu sejauh Anda tidak ingin memeriksa konten file) Anda dapat menggunakan:

ls | grep touch

Tapi, saya ulangi, findadalah solusi yang lebih baik dan lebih bersih untuk tugas Anda.

Zagorax
sumber
Terima kasih @Zororax. Ini tepatnya. Berharap perintahnya tidak begitu lama tapi ayee :)
Dru
2
@Ru, Dimodifikasi untuk menutup kasing jika Anda ingin menghindari titik dua. findadalah alat yang sangat kuat, itu pasti 'panjang'. :)
Zagorax
Terima kasih yang pertama melakukannya dengan sempurna tanpa mengembalikan konten apa pun.
Dru
3
@Ru, jika Anda ingin 'lebih pendek' Anda dapat menghindari -printkarena ini adalah perilaku default dan .karena ini adalah folder default di mana ia memeriksa.
Zagorax
1
find . -name "*string*"Bekerja dengan baik juga. Menghapus .melempar kesalahan pada saya. Terima kasih lagi @Zororax.
Dru
14

Gunakan grep sebagai berikut:

grep -R "touch" .

-Rberarti berulang. Jika Anda lebih suka tidak masuk ke subdirektori, lewati saja.

-iberarti "abaikan case". Anda mungkin menemukan ini patut dicoba juga.

carlspring
sumber
Bagus. Saya perhatikan bahwa beberapa konten file mengikuti a :. Apakah ada cara untuk menahannya? Mungkin menggunakan opsi?
Dru
1
Coba:grep -R "touch" . | cut -d ":" -f 2
carlspring
Itu sepertinya hanya menghasilkan konten file. Anda pada dasarnya menjawab pertanyaan saya, saya dapat mencoba melakukan beberapa penggalian karena menahan konten.
Dru
Ah ... Anda hanya perlu nama file? Jalankan: grep -R "touch" . | cut -d ":" -f 1 (maaf pasti salah membaca Anda).
carlspring
Terima kasih @carlspring ini menarik. grepbaik mengembalikan file dengan isi dan nama file yang mengandung touchatau konten yang mengandung touch, saya belum yakin yang terjadi, belum. Dari daftar file yang dikembalikan, setengahnya berisi touchjudul dan setengah lainnya berisi dalam touchtubuh, bukan judul. Baru menyadari ini.
Dru
5

The -maxdepthpilihan harus sebelum -namepilihan, seperti di bawah ini.,

find . -maxdepth 1 -name "string" -print
Sunil Dias
sumber
1
Anda harus meletakkan * sebelum dan sesudah "string".
Aerin
3
find $HOME -name "hello.c" -print

Ini akan mencari seluruh $HOME(yaitu /home/username/) sistem untuk setiap file bernama "hello.c" dan menampilkan nama path mereka:

/Users/user/Downloads/hello.c
/Users/user/hello.c

Namun, itu tidak akan cocok HELLO.Catau HellO.C. Untuk mencocokkan adalah tidak peka huruf besar-kecil, -inamepilihan sebagai berikut:

find $HOME -iname "hello.c" -print

Output sampel:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Lewati -type fpilihan untuk hanya mencari file:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

The -inamebekerja baik pada GNU atau BSD (termasuk OS X) perintah versi find. Jika versi perintah find Anda tidak mendukung -iname, coba sintaks berikut menggunakan grepperintah:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

ATAU coba

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Output sampel:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
shilovk
sumber
0

Jika string ada di awal nama, Anda bisa melakukan ini

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt
Steven Penny
sumber
3
compgenbukan palu yang tepat untuk paku ini. Alat yang jarang digunakan ini dirancang untuk mencantumkan perintah yang tersedia , dan karena itu, ia mencantumkan file dalam direktori saat ini (yang bisa berupa skrip) dan tidak dapat muncul kembali atau melihat melewati awal nama file atau mencari isi file, membuatnya menjadi kebanyakan tidak berguna.
msanford
0

Alternatif dari banyak solusi yang telah disediakan adalah memanfaatkan glob **. Saat Anda menggunakan bashopsi globstar( shopt -s globstar) atau menggunakan zsh, Anda bisa menggunakan glob **untuk ini.

**/bar

melakukan pencarian direktori rekursif untuk file bernama bar(berpotensi termasuk file bardalam direktori saat ini). Perhatikan bahwa ini tidak dapat digabungkan dengan bentuk globbing lain dalam segmen jalur yang sama; dalam hal ini, *operator kembali ke efek biasanya.

Perhatikan bahwa ada perbedaan tipis antara zshdan di bashsini. Meskipun bashakan melintasi tautan lunak ke direktori, zshtidak akan. Untuk ini, Anda harus menggunakan glob ***/di zsh.

Kvantour
sumber
0
find / -exec grep -lR "{test-string}" {} \;
Shahid
sumber
1
Jawaban ini ditandai karena kualitasnya rendah. Tolong jelaskan apa yang dilakukan perubahan yang Anda usulkan.
Miroslav Glamuzina
-2
grep -R "somestring" | cut -d ":" -f 1
Saurabh kukade
sumber
2
Ini tampaknya menjadi jawaban untuk pertanyaan yang berbeda - tetapi karena Anda tidak memberikan penjelasan, itu tidak jelas bagi penanya atau orang lain.
Toby Speight