Saya memiliki beberapa gambar bernama dengan string uuid1 yang dihasilkan. Misalnya 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg. Saya ingin mencari tahu semua gambar ini menggunakan perintah "find":
find . -regex "[a-f0-9\-]\{36\}\.jpg".
Tapi itu tidak berhasil. Ada yang salah dengan regex? Bisakah seseorang membantu saya dengan ini?
Jawaban:
Perhatikan bahwa Anda perlu menentukan
.*/
di awal karenafind
cocok dengan seluruh jalur.Contoh:
Versi pencarian saya:
sumber
"^ ... $"
sekitar regex Anda. Itu harus cocok dengan garis hasil SELURUH./
dalam.*/
karena.*
cocok dengan nol atau lebih dari (hampir) karakter apa pun.\{36\}
valid types are 'findutils-default', 'awk', ' egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic', 'posix-egrep', 'posix -extended', 'posix-minimal-basic', 'sed'.
-regextype
bendera sebelum para-regex
bendera, jika tidak maka tidak berlaku!The
-regex
ekspresi menemukan sesuai dengan seluruh nama , termasuk path relatif dari direktori saat ini. Untukfind .
ini selalu dimulai dengan./
, lalu direktori apa pun.Juga, ini adalah
emacs
ekspresi reguler, yang memiliki aturan pelarian lain selain ekspresi reguler egrep biasa.Jika ini semua langsung di direktori saat ini, maka
harus bekerja. (Saya tidak begitu yakin - Saya tidak bisa mendapatkan pengulangan yang dihitung untuk bekerja di sini.) Anda dapat beralih ke ekspresi egrep dengan
-regextype posix-egrep
:(Perhatikan bahwa semua yang dikatakan di sini adalah untuk menemukan GNU, saya tidak tahu apa-apa tentang BSD yang juga merupakan default pada Mac.)
sumber
posix-egrep
tipe itu berfungsi untuk saya.-regextype
adalah opsi untuk GNUfind
dan bukan BSD (setidaknya tidak seperti Mac BSD)find
. Jika opsi ini tidak tersedia, pastikan untuk menginstal GNU find. Jika pada Mac itu mungkin dengan paket minumanfindutils
. Temukan kemudian tersedia melaluigfind
.Menilai dari jawaban lain, sepertinya ini adalah kesalahan find.
Namun Anda dapat melakukannya dengan cara ini sebagai gantinya:
find . * | grep -P "[a-f0-9\-]{36}\.jpg"
Anda mungkin harus mengubah sedikit grep dan menggunakan opsi yang berbeda tergantung pada apa yang Anda inginkan tetapi berfungsi.
sumber
find
's-prune
fungsi yang akan melewatkan direktori tertentu sama sekali. Paling sering ini tidak terlalu penting, tetapi perlu disebutkan.pada Mac OS X (BSD find) : Sama seperti jawaban yang diterima,
.*/
awalan diperlukan untuk mencocokkan jalur lengkap:man find
mengatakan-E
menggunakan dukungan regex yang diperluassumber
-E
tidak tersedia di Ubuntu (diuji pada WSL Ubuntu)Coba gunakan tanda kutip tunggal (') untuk menghindari shell melarikan diri dari string Anda. Ingatlah bahwa ekspresi harus sesuai dengan keseluruhan jalur, yaitu harus terlihat seperti:
Terlepas dari itu, tampaknya temuan saya (GNU 4.4.2) hanya mengetahui ekspresi reguler dasar, terutama bukan sintaks {36}. Saya pikir Anda harus melakukannya tanpa itu.
sumber
Cara sederhana - Anda dapat menentukan. * Di awal karena menemukan cocok dengan seluruh jalur.
temukan versi
sumber
Anda harus menggunakan jalur direktori absolut ketika menerapkan instruksi temukan dengan ekspresi reguler. Dalam contoh Anda, the
harus diubah menjadi
Di sebagian besar sistem Linux, beberapa disiplin dalam ekspresi reguler tidak dapat dikenali oleh sistem itu, jadi Anda harus secara eksplisit menunjukkan -regexty seperti
sumber