Bagaimana saya bisa mendaftar file dengan nama file yang diakhiri dengan karakter terakhir dan dengan .txt
ekstensi?
Saya sudah mencoba ls *+([[:digit:]]).txt
tetapi ini berlaku untuk abc12.txt
dan abc2.txt
.
Tapi saya hanya perlu mendapatkannya abc2.txt
. Bagaimana saya bisa melakukan itu?
Apakah ada bentuk apa pun :digit:
yang akan melakukan ini?
shopt -s extglob
.Jawaban:
Bagaimana tentang:
Pada
!
awal kelompok melengkapi artinya.Seperti disebutkan dalam komentar, ini adalah bash, coba mis .:
sumber
ls
) tidak mendukung ekspresi reguler di sini. Ini adalah ekspresi nama file (Globbing) . Anda dapat melihat perbedaannya dalam contoh Anda: di sini,*
adalah wildcard, yang tidak ada dalam ekspresi reguler, di mana Anda akan menggunakan.*
untuk mencapai hal yang sama. Ekspresi reguler jauh lebih kuat daripada globbing.Pertanyaan itu meminta ekspresi reguler. Bash, dan karenanya
ls
, tidak mendukung ekspresi reguler di sini. Apa yang didukungnya adalah ekspresi nama file ( Globbing ), suatu bentuk wildcard. Ekspresi reguler jauh lebih kuat dari itu.Jika Anda benar-benar ingin menggunakan ekspresi reguler, Anda dapat menggunakan
find -regex
seperti ini:Find bersifat rekursif secara default, tetapi
ls
tidak. Untuk hanya menemukan file di direktori saat ini, Anda dapat menonaktifkan rekursi-maxdepth 1
. Temukan kecocokan dengan nama file dengan path, itu sebabnya nama file dimulai dengan./
jika Anda menjalankan find in.
. Regex dimulai dengan\./
mengatasinya. Perhatikan bahwa dalam sebuah regex,.
adalah karakter khusus yang cocok dengan karakter apa pun, tetapi di sini kami benar-benar menginginkan sebuah titik, itulah sebabnya kami menghindarinya dengan backslash. Kami melakukan hal yang sama untuk titik masuk.txt
, karena regex juga akan cocokAtxt
. Kelas digit sama dengan untuk globbing, hanya saja Anda perlu^
alih-alih!
membalikkan kelas karakter.Jika Anda ingin mendapatkan output
ls
, maka Anda dapat menggunakan-exec ls
seperti ini:find
mendukung beberapa rasa regex yang berbeda. Anda dapat menentukan-regextype
, misalnya:Bagi saya, tipe yang mungkin adalah: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Anda dapat menjalankan
find -regextype help
untuk mencari tahu apa yang didukung pada sistem Anda.sumber
Dengan ksh extended globs (atau
bash -O extglob
atauzsh -o kshglob
) yang sudah Anda gunakan, itu akan menjadi:Atau
Jika Anda ingin mencocokkan
a1.txt
dan2.txt
tetapi tidaka12.txt
juga12.txt
.Namun perhatikan bahwa dalam ksh dan bash (kecuali jika Anda mengatur
failglob
opsi untuk mendapatkan perilaku yang mirip dengan zsh), jika pola itu tidak cocok dengan file apa pun, pola tersebut akan diteruskan secara harfiah kels
, dan jika file (anehnya nama) itu terjadi pada ada, itu akan terdaftarls
meskipun tidak cocok dengan pola itu sendiri.Untuk menyertakan
.2.txt
, mengaturdotglob
pilihan dalambash
, menambahkan(D)
kualifikasi gumpal dizsh
, atau setFIGNORE
ke!(.|..)
dalamksh93
.sumber