regex cocok dengan "temukan"

8

Saya mencoba menggunakan perintah temukan untuk menemukan file di folder rumah saya, namun setiap kali saya mencoba dan menjalankan ini saya tidak mendapatkan hasil:

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

Saya juga sudah mencoba ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$tetapi tidak mengembalikan hasil juga.

File yang saya cari hanya untuk mengujinya /home/jack/Music/Foals/My Number.flac

Saya ingin mengecualikan hasil file tersembunyi dari pencarian saya.

Jack Jones
sumber
2
Saya tidak kenal locate. Apakah masuk akal untuk menggabungkan -b(yaitu "Cocokkan hanya nama dasar dengan pola yang ditentukan.") Dengan jalur di --regexp? Mengapa Anda melarikan diri /?
Hauke ​​Laging
Maaf saya menggunakan pembuat regex yang menyarankan saya melarikan diri dari karakter tersebut, dan saya kira Anda benar tentang flag -b, saya akan menyingkirkannya sekarang
Jack Jones
1
Apa yang (My.)*seharusnya dilakukan? My.*$bekerja. Anda harus melarikan diri ()dalam RE dasar.
Hauke ​​Laging
1
Anda menggunakan regex yang diperluas. Tapi --regexpbutuh regex dasar. Coba ubah --regexpke --regex(tidak p). Halaman manual mengatakan --regextidak cocok pencocokan regex.
Mikel

Jawaban:

6

Ini sepertinya melakukan pekerjaan.

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

Kutipan dari manual:

-i, --ignore-case Abaikan perbedaan case saat mencocokkan pola.

-r, --regexp REGEXP Mencari REGEXP regexp dasar. Tidak ada POLA yang diizinkan jika opsi ini digunakan, tetapi opsi ini dapat ditentukan beberapa kali.

Graeme
sumber
Di Linux, mlocate 0.26-1ubuntu2 (Ubuntu 16.04 LTS Xenial Xerus, pada 2018-02-05), perintah mengembalikan kesalahan berikut "loc: argumen non-opsi tidak diperbolehkan dengan --regexp". mlocate adalah paket aktual (/ usr / bin / loc adalah symlink ke mlocate).
Hans Deragon
1

Bagaimana cara kerjanya?

Indeks file yang locatemenggunakan perintah hanya dibangun kembali sekali sehari, biasanya. Ini dibangun oleh pekerjaan cron ini /etc/cron.daily/mlocate,. Jadi entri Anda kemungkinan belum ada di sana. Anda dapat menjalankannya kembali jika Anda ingin secara manual membangun kembali indeks ini.

$ sudo /etc/cron.daily/mlocate

Menggunakan find

Namun Anda mungkin lebih baik menggunakan perintah seperti finduntuk mencari file di direktori home Anda.

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

Menggunakan GUI

Anda juga mungkin tertarik dengan alat pencarian grafis. Lihatlah Q&A Q&A lainnya yang berjudul: GTK Frontend untuk mencari yang mencakup satu alat yang disebut Catfish. Alat ini dapat menggunakan locatedata dan juga findperintah.

slm
sumber
1
Saya sering menemukan locatelebih cepat daripada findjika saya harus melakukan yang updatedbpertama. Selama database sudah cukup mutakhir pada kebanyakan sistem updatedbtidak akan lama. Menemukan sintaks mungkin lebih mudah dalam hal ini.
Graeme
Ya saya menggunakannya setiap hari juga, itu hanya pada server di mana saya menulis sesuatu yang saya akan sering beralih find.
slm
Ya, seharusnya meletakkan 'kebanyakan sistem desktop'
Graeme
1

Anda juga bisa mengambil pendekatan yang berbeda:

locate "My file" | grep '/home/jack' | grep -v '/\.'

Saya tidak yakin apa yang Anda coba lakukan. Anda menggunakan -ibendera untuk membuatnya kasus sensitif dan regex Anda tidak sangat spesifik, Anda tampaknya atas keinginan untuk menemukan semua file atau folder yang berada di bawah /home/jackdan yang mengandung MY, My, my, atau mYdi mana saja di nama file. Jika demikian, jalankan saja

locate -i my | grep '/home/jack' | grep -v '/\.'
terdon
sumber
0

Ini seharusnya berfungsi - hanya cocok dengan file dan folder yang tidak disembunyikan:

find /home/jack -name "[^.]*My.*"

lebih sederhana - ini cocok dengan file yang tidak memiliki direktori tersembunyi di mana saja di pohon direktori. Mungkin ini yang Anda inginkan:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done
jayhendren
sumber
Saya lebih suka menggunakan locate, karena saya mencoba mengintegrasikannya ke dalam GUI Python untuk mencari saat Anda mengetik dan lebih cepat. Tapi Terimakasih!
Jack Jones
@JackJones Anda bahkan tidak perlu locatemempercepat hasilnya. Misalnya:echo /home/jack/**/*My.*
jayhendren