Yanıtlar:
Nasıl olur:
ls *[!0-9][0-9].txt
Grubun !
başında anlamını tamamlar.
Yorumlarda belirtildiği gibi, bu bash yapıyor, örneğin deneyin:
printf "%s\n" *[!0-9][0-9].txt
ls
) ifadelerinin düzenli ifadeleri desteklemediğini unutmayın. Bunlar dosya adı ifadeleridir (Globbing) . Örneğinizde zaten farkı görebilirsiniz: burada, *
normal ifadelerde .*
bulunmayan ve aynı şeyi elde etmek için kullanacağınız bir joker karakter var . Düzenli ifadeler globbing'ten çok daha güçlüdür.
Soru düzenli ifadeler istedi. Bash, dolayısıyla ls
burada düzenli ifadeleri desteklemez. Desteklediği şey , bir tür joker karakter olan dosya adı ifadeleridir ( Globbing ). Düzenli ifadeler bundan çok daha güçlüdür.
Gerçekten düzenli ifadeler kullanmak istiyorsanız, şu şekilde kullanabilirsiniz find -regex
:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Bul varsayılan olarak yinelemelidir, ancak ls
değildir. Yalnızca geçerli dizindeki dosyaları bulmak için ile özyinelemeyi devre dışı bırakabilirsiniz -maxdepth 1
. Dosya adıyla yolla eşleşmeleri bulun, bu yüzden dosya ./
bulmayı çalıştırırsanız dosya adları ile başlar .
. Normal ifade bununla \./
başa çıkmak için başlar . Normal ifadede, .
herhangi bir karakterle eşleşen özel bir karakter olduğunu unutmayın, ancak burada gerçekten bir nokta istiyoruz, bu yüzden bir ters eğik çizgi ile kaçıyoruz. Noktadaki nokta için de aynısını yaparız .txt
, çünkü normal ifade de aynı şekilde eşleşir Atxt
. Rakam sınıfları globbing ile aynıdır, sadece karakter sınıfını tersine çevirmek ^
yerine ihtiyacınız vardır !
.
Çıktısını almak istiyorsanız ls
, şu şekilde kullanabilirsiniz -exec ls
:
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
find
birkaç farklı regex aromasını destekler. Bir belirtebilirsiniz -regextype
, örneğin:
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
Benim için olası türler: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix genişletilmiş', 'posix-minimal-temel', 'sed' find -regextype help
Sisteminizde nelerin desteklendiğini bulmak için çalıştırabilirsiniz .
Halihazırda kullandığınız ksh genişletilmiş glob'ları (veya bash -O extglob
veya zsh -o kshglob
) ile şunlar olur:
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
Veya
ls -d -- !(*[[:digit:]])[[:digit:]].txt
Üzerinde eşleştirmek istiyorsanız a1.txt
ve2.txt
fakat a12.txt
ne 12.txt
.
Bununla birlikte, ksh ve bash'da ( failglob
zsh'lere benzer bir davranış elde etme seçeneğini ayarlamadıysanız ), bu desen herhangi bir dosyayla eşleşmezse, desen tam anlamıyla iletilir ls
ve bu (garip bir şekilde adlandırılmış) dosya var ise, ls
desenin kendisiyle eşleşmese de listelenecektir .
Dahil etmek .2.txt
, set dotglob
seçeneği bash
eklemek (D)
glob içinde eleme zsh
veya set FIGNORE
için !(.|..)
de ksh93
.
shopt -s extglob
.