`Ls` ile listeleme ve düzenli ifade


15

Dosya adı son karakteri ve .txtuzantısı olan dosyaları nasıl listeleyebilirim ?

Denedim ls *+([[:digit:]]).txtama bu abc12.txtve için geçerlidir abc2.txt.

Ama sadece almam gerek abc2.txt. Bunu nasıl yapabilirim?

:digit:Bunu yapacak herhangi bir türü var mı ?


2
Bu unutulmamalıdır desen ile geçerlidir globbing genişletilmiş endabled: shopt -s extglob.
bağışta bulunanlar

Yanıtlar:


20

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

3
Burada bash (ie 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.
Christopher

3

Soru düzenli ifadeler istedi. Bash, dolayısıyla lsburada 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 lsdeğ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 {} \;

findbirkaç 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 helpSisteminizde nelerin desteklendiğini bulmak için çalıştırabilirsiniz .


0

Halihazırda kullandığınız ksh genişletilmiş glob'ları (veya bash -O extglobveya 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.txtne 12.txt.

Bununla birlikte, ksh ve bash'da ( failglobzsh'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 lsve bu (garip bir şekilde adlandırılmış) dosya var ise, lsdesenin kendisiyle eşleşmese de listelenecektir .

Dahil etmek .2.txt, set dotglobseçeneği basheklemek (D)glob içinde eleme zshveya set FIGNOREiçin !(.|..)de ksh93.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.