Ls [13] ve ls {1,3} arasındaki fark nedir?


11

Komut kullanarak dizinimde üç dosya oluşturdum touch inv{1..3}.txt. Şimdi iki komut kullandım ve çıktıları hemen hemen aynı. Bu iki komut ls inv[13].txtve ls {1,3}.txt.

Peki bu ikisi nasıl farklı? Köşeli parantezler parantezlere göre nasıl farklıdır? Ayrıca "linux [..]" için googling yapıyordum, ancak hiçbir şey bulamadım, bu yüzden linux terminolojisinde bu şeylerin ne olduğunu anlayabilir miyim?

Teşekkürler


2
Bunun adı "dosya adı genişletmesi" veya "globbing" dir.
Bayt Komutanı

Bunlardan hangisi dosya adı genişletme veya zonklamadır? Köşeli ayraç ([..]) veya çiçek köşeli ayraç ({..}) mı?
posixKing

Yanıtlar:


14
  • {}küme ayracı genişletme denir. : Bu iki biçimi vardır {x..y}ve {x,y}yerine, xve yherhangi bir alfabetik veya sayısal değerle.

    İlk formda, ile (dahil) {x..y}arasındaki tüm değerlere genişletilir . Örneğin, genişletilmiş olacak , , , .xy{2..5}2345

    İkinci açık formda, {x,y}ancak genişletilmiş olacak x, y. Örneğin, ve {2,5}olarak genişleyecektir .25

    Herhangi bir genişleme mümkün değilse, desen tam anlamıyla işlenir {a..3}.

    Dikkat edilmesi gereken önemli bir nokta, ayracı genişletmenin (eğer mümkünse) dosya oluşturma / eşleştirme sırasında herhangi bir dosya eşleşmesine bakılmaksızın yapılmasıdır.

  • []bir yol adı genişletme (veya globbing) deseni olarak bilinir. Brace genişletmesinin aksine, yalnızca dosya adlarını eşleştirirken kullanabilirsiniz, dosya oluştururken kullanırsanız tam anlamıyla işlem görür.

    İki şekli vardır: [xyz...]ve [x-y].

    İlk formda, köşeli parantez içindeki herhangi bir karakteri ayrı ayrı eşleştirir, yani her karakter ayrı ayrı ele alınır. Yani için [25].txtbir adlı dosyayı maç olacak 2.txtya 5.txtyönelik iken, geçerli dizinde [245].txto adında herhangi bir dosyayı maç olacak 2.txtya 4.txtya 5.txt.

    İkinci formda, mümkünse tam anlamıyla muamele edilmişse, münferit olarak eşleştirilmeden önce bir menzil genişletmesi yapılır. Bu nedenle [2-5]. txt, 2.txtveya 3.txtveya 4.txtveya adındaki herhangi bir dosyayla eşleşir 5.txt. Aralık genişletilemezse, örneğin durumunda [a-3].txt.


Bu ikisi arasındaki önemli bir davranış farkı, gerçekte daha az eşleştirilirken eşleştirilecek daha fazla patern olduğu zamandır. Brace genişletmesi ne olursa olsun yapıldığından, yol adı genişletmesi geri kalanı için herhangi bir hata olmadan mümkün olan her şeyle eşleşirken, bazı dosyaların bulunmadığını gösterir.

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

Taşınabilirlik Notu:

Yol []adı genişletme operatörü POSIX tarafından tanımlanır, dolayısıyla Bourne kabuğu ve türevleri arasında taşınabilir.

Brace genişlemesi,, {}POSIX tarafından tanımlanmadığı için tüm mermiler arasında taşınabilir değildir. Örneğin, dash( shUbuntu'da) buna sahip değil. Bu ödünç edildi cshve sadece örneğin belirli kabukları üzerinde çalışacak bash, zsh, ksh93, fish. Uygulamadan önce kullandığınız kabuğun bunu desteklediğinden emin olun.


Misal:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

1
[ ]Kabuk yapılandırmasına bağlı olarak farklı olabileceğinden, eşleşme olmadığında genişleme davranışına güvenmekten kaçınılmalıdır . Dosya adında [veya ]bir dosya adında kullanmak istiyorsanız , komutunuzda alıntılanmalıdır. Ayrıca {13..79}ve arasındaki farkı da fark etmeye değer [13-79]. Dan aralığındaki tüm sayıları üretecek ilk 13için 79, ikinci karakterleri maç olacak 1, 3, 4, 5, 6, 7, ve 9.
kasperd

@kasperd Evet, bunun için nullglob(veya benzeri). Hakkında [13-79]eşleştirme, ben `[] karakteri başına davranışı hakkında cevabım açıkça belirtilen düşünüyorum.
heemayl

@heemayl `` 1..3} '' formunun bashizm olduğunu da belirtmek gerekir. Bu kısa sürede çalışmaz. Bence kshbu özelliği var, ama mksh ve pkdsh gibi daha modern lezzetler değil
Sergiy Kolodyazhnyy

@ Taşınabilirlik notu eklendi.
heemayl

7

İki form arasındaki temel fark burada gösterilmiştir:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txtbir glob ve dosya sisteminizdeki eşleşen dosyaların listesini genişletir. Bu yol adı genişletmesidir .

inv{1,5}.txtgenişler inv1.txtve inv5.txtne olursa olsun dosyaları dosya sisteminde aslında ne. Bu küme ayracı genişlemesi .


Diğer önemli fark, yazabileceğiniz ba{con,tman}ve köşeli parantez kullanarak eşdeğer olmamasıdır. IOW, küme ayracı genişletme yalnızca tek karakterler için değil.
ocaklar
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.