Bagaimana cara "grep" untuk nama file, bukan isi file?

135

grep digunakan untuk mencari dalam suatu file untuk melihat apakah ada baris yang cocok dengan ekspresi reguler yang diberikan. Namun, saya memiliki situasi ini - saya ingin menulis ekspresi reguler yang akan cocok dengan nama file itu sendiri (dan bukan isi file). Saya akan menjalankan ini dari direktori root sistem, untuk menemukan semua file yang cocok dengan ekspresi reguler.

Misalnya, jika saya ingin menemukan semua file formulir VB yang dimulai dengan "f" dan diakhiri dengan .frm, saya akan menggunakan ekspresi reguler -

   "f[[:alnum:]]*\.frm"

Bisakah grep melakukan ini? Jika tidak, apakah ada utilitas yang memungkinkan saya melakukan ini? Terima kasih.

Kode biru
sumber

Jawaban:

120

Anda harus menggunakan, findbukan grepdalam kasus ini.

Anda juga dapat menggunakan finddalam kombinasi dengan grepatau egrep:

$ find | grep "f[[:alnum:]]\.frm"
Pablo Santa Cruz
sumber
12
Ini tidak perlu. Temukan memiliki fungsionalitas bawaan dengan -regexopsi.
whereswalden
4
itu tidak perlu di sini, tetapi grep mendukung perl regex sedangkan find tidak.
Dan
2
Tidak, Anda bisa menggunakan grep. Jauh lebih mudah daripada menggunakan find. Tambahkan saklar "-rl" dan itu akan mencari nama file, bukan file. Lihat posting saya di bawah ini.
RM
@ alpha_989, saya katakan grep mendukungnya, yang ia lakukan: gnu.org/software/grep/manual/html_node/… intinya piping ke grep hanya diperlukan jika Anda membutuhkan pcre. whereswalden memiliki jawaban yang tepat
Dan
60

Contoh

find <path> -name *FileName*

Dari manual:

temukan pola -nama

Basis nama file (jalur dengan direktori utama dihapus) cocok dengan pola pola shell. Karena direktori utama dihapus, nama file yang dianggap cocok dengan -nama tidak akan menyertakan slash, jadi "-nama a / b" tidak akan pernah cocok dengan apa pun (Anda mungkin perlu menggunakan -path sebagai gantinya). Metakarakter ("*", "?", Dan "[]") cocok dengan "." di awal nama dasar (ini adalah perubahan pada find-utils-4.2.2; lihat bagian KONVERSI STANDAR di bawah). Untuk mengabaikan direktori dan file di bawahnya, gunakan -prune; lihat contoh dalam deskripsi -path. Kawat gigi tidak diakui sebagai istimewa, terlepas dari kenyataan bahwa beberapa cangkang termasuk Bash imbes kawat gigi dengan makna khusus dalam pola cangkang. Pencocokan nama file dilakukan dengan menggunakan fungsi perpustakaan fnmatch (3). Jangan lupa untuk menyertakan pola dalam tanda kutip untuk melindunginya dari ekspansi oleh shell.

javaPlease42
sumber
2
Saya menemukan jawaban ini sebagai yang paling bermanfaat. Saya menambahkan beberapa opsi tambahan: find . -maxdepth 1 -name "*filename*" -print
JSON C11
47

Seperti Pablo mengatakan, Anda perlu menggunakan findbukan grep, tapi ada tidak perlu pipa findke grep. findmemiliki fungsionalitas bawaan:

find . -regex 'f[[:alnum:]]\.frm'

findadalah program yang sangat kuat untuk mencari file dengan nama dan mendukung pencarian berdasarkan tipe file, pembatasan kedalaman, menggabungkan berbagai istilah pencarian dengan operasi boolean, dan menjalankan perintah sewenang-wenang pada file yang ditemukan. Lihat halaman manual find untuk informasi lebih lanjut.

ketika tiba
sumber
1
Saya akan menambahkan fitur yang sangat berguna untuk mencari berdasarkan tanggal dengan -mtimedan-mmin
Johnride
1
Juga, -regex switch melakukan kecocokan dengan seluruh jalur. Jadi untuk bekerja contoh perlu ditambahkan. * Di awal regex.
tumasgiu
15

Anda dapat menemukan path lengkap file menggunakan grep, cukup pipa output tree

tree -f | grep filename

Berikut adalah fungsi yang dapat Anda masukkan ke .bash_profile atau .bashrc Anda

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path
jasonleonhard
sumber
-f adalah opsional.
jasonleonhard
10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor types: -

f: file biasa

d: direktori

l: tautan simbolik

c: perangkat karakter

b: blokir perangkat

Sireesh Yarlagadda
sumber
1
Sepertinya saya tidak bisa menggunakan nama file yang mengikuti -type typedescriptorsaja. Apakah ini sebuah kesalahan?
Allan Nørgaard
5

Anda juga dapat melakukan:

tree | grep filename

Ini mem-pipe output dari perintah tree ke grep untuk pencarian. Ini hanya akan memberi tahu Anda apakah file tersebut ada.

caylus
sumber
1

Tidak, grep bekerja dengan baik untuk ini:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"
RM
sumber
1
Ini mencari isi file untuk "nama file", kemudian mencetak nama file dengan yang cocok. OP menginginkan nama file yang cocok, bukan konten file.
Matius
1
Setuju, ini tidak mencari nama file, hanya mencetak nama-nama file yang isinya cocok. Anda telah salah paham baik opsi -lmaupun -Lopsi.
Prometheus
2
+1 untuk menjadi persis apa yang saya butuhkan. Senang saya tidak perlu mengkritik pertanyaan untuk menemukan jawaban yang saya butuhkan
Alexander McNulty
-1

Juga untuk banyak file.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"
DimiDak
sumber
-1

Cara termudah adalah

find . | grep test

di sini temukan akan mendaftar semua file dalam direktori (.) yaitu saat ini, secara rekursif. Dan kemudian itu hanya langkah sederhana. semua file yang namanya "test" akan muncul.

Anda dapat bermain dengan grep sesuai kebutuhan Anda. Catatan: Karena grep adalah klasifikasi string umum, grep dapat memberikan Anda tidak hanya nama file. tetapi jika path memiliki direktori ('/xyz_test_123/other.txt') juga akan muncul pada set hasil. Bersulang

sachyy
sumber
Ini akan menemukan apa saja dengan "test" di jalan, mis ./foo/bar/latest/fred.txt.
Paul R
oh Yang saya tidak pikirkan. Terima kasih telah menyebutkan.
sachyy