Linux’ta Wildcard Kullanımı

Bazen çalıştıracağınız komutun belirli bir düzendeki dosya ve/veya dizinleri etkilemesini isteyebilirsiniz. Böyle durumlarda wildcard kullanımı size ciddi bir kolaylık sağlar.

Wildcard kullanımı, karşınıza Bash globbing veya file globbing isimleriyle de çıkabilir.

Örneklerden önce, kullanacağımız dosyaları oluşturalım:

[root@gnuadmin ~]# touch password passwd sshd.log dhcp.log tftp.log blog ping pong png
[root@gnuadmin ~]# ls -l
toplam 0
-rw-r--r--. 1 root root 0 Oca 11 15:48 blog
-rw-r--r--. 1 root root 0 Oca 11 15:48 dhcp.log
-rw-r--r--. 1 root root 0 Oca 11 15:48 passwd
-rw-r--r--. 1 root root 0 Oca 11 15:48 password
-rw-r--r--. 1 root root 0 Oca 11 15:48 ping
-rw-r--r--. 1 root root 0 Oca 11 15:48 png
-rw-r--r--. 1 root root 0 Oca 11 15:48 pong
-rw-r--r--. 1 root root 0 Oca 11 15:48 sshd.log
-rw-r--r--. 1 root root 0 Oca 11 15:48 tftp.log
Linux'ta Wildcard Kullanımı
Linux’ta Wildcard Kullanımı

Soru İşareti (?) Karakteri

? karakteri, tek bir karakter yerine geçer. Soru işareti görülen kısımda, bir adet karakter olması beklenir.

Elimizde “ping”, “pong” ve “png” isimli 3 dosya var. Aşağıdaki listelemeyi inceleyin:

[root@gnuadmin ~]# ls p?ng
ping  pong

Yazmış olduğumuz “p?ng” ifadesinin anlamı şudur: “p” karakteri ile başlayan, sonrasında bir tane daha karakter olan ve “ng” ile biten şeyler.

Bu şartı sağlayan “ping” ve “pong” dosyalarının listelendiğini görüyoruz. Ancak “png” dosyası listelenmedi. Çünkü koşulumuz, “p” harfinden sonra bir karakterin daha olması ve “ng” ile bitmesiydi.

Soru işareti karakteri, ancak ve ancak 1 karakter ile eşleşir. Soru işareti sayısını arttırarak, pattern’ı değiştrmek mümkündür. Örneğin, 4 karakter ile başlayan ve “.log” ile biten dosyaları listelemeyi deneyelim:

[root@gnuadmin ~]# ls ????.log
dhcp.log  sshd.log  tftp.log

Benzer şekilde, “p” ile başlayıp 2 karakter ile devam eden dosyaları listelediğimizde, yalnızca “png” dosyasının bu pattern’a uygun olduğunu görürüz:

[root@gnuadmin ~]# ls p??
png

Yıldız (Asterisk, *) Karakteri

“*” karakteri, sıfır dahil herhangi bir sayıda karakteri temsil eder. Yıldız görülen kısımda, belirsiz sayıda karakter olabilir.

Elimizdeki dosyalardan 3 tanesinin sonunda “.log” ifadesi var. Aşağıdaki listelemeyi inceleyin:

[root@gnuadmin ~]# ls -l *.log
-rw-r--r--. 1 root root 0 Oca 14 00:30 dhcp.log
-rw-r--r--. 1 root root 0 Oca 14 00:30 sshd.log
-rw-r--r--. 1 root root 0 Oca 14 00:30 tftp.log

Görüldüğü üzere, sonunda “.log” olan ve bu kısımdan öncesinin herhangi bir şey olabileceği tüm dosyalar listelendi.

Farklı bir senaryo düşünelim. “p” ile başlayan ve “d” ile biten tüm dosyaları listeleyelim:

[root@gnuadmin ~]# ls -l p*d
-rw-r--r--. 1 root root 0 Oca 14 00:30 passwd
-rw-r--r--. 1 root root 0 Oca 14 00:30 password

Burada “*” yerine “?” kullansaydık; “p” ile başlayan, “d” ile biten ve bu iki karakter arasında bir karakter olan dosyalar getirilecekti, ki öyle bir dosyamız yok.

“s” harfi ile başlayan dosyalar:

[root@gnuadmin ~]# ls -l s*
-rw-r--r--. 1 root root 0 Oca 14 00:30 sshd.log

“s” harfi ile biten dosyalar (yok):

[root@gnuadmin ~]# ls -l *s
ls: *s'e erişilemedi: Böyle bir dosya ya da dizin yok

Herhangi bir yerinde “s” harfi olan dosyalar:

[root@gnuadmin ~]# ls -l *s*
-rw-r--r--. 1 root root 0 Oca 14 00:30 passwd
-rw-r--r--. 1 root root 0 Oca 14 00:30 password
-rw-r--r--. 1 root root 0 Oca 14 00:30 sshd.log

Aşağıdaki örnek ise, yıldız karakterinin 0 (sıfır) karakter yerine geçtiği bir durumu gösteriyor:

[root@gnuadmin ~]# ls -l p*ng
-rw-r--r--. 1 root root 0 Oca 14 00:30 ping
-rw-r--r--. 1 root root 0 Oca 14 00:30 png
-rw-r--r--. 1 root root 0 Oca 14 00:30 pong

“p” ile başlayan, devamında bir şeyler olan ya da olmayan ve “ng” ile biten dosyaları listeledik.

Köşeli Parantez Kullanımı

Bu örnekler için elimizdeki dosyaları silelim ve yeni dosyalar oluşturalım.

[root@gnuadmin ~]# touch balık batık bitik betik bot boot bOt boat bit bet
[root@gnuadmin ~]# ls -l
toplam 0
-rw-r--r--. 1 root root 0 Oca 14 00:46 balık
-rw-r--r--. 1 root root 0 Oca 14 00:46 batık
-rw-r--r--. 1 root root 0 Oca 14 00:46 bet
-rw-r--r--. 1 root root 0 Oca 14 00:46 betik
-rw-r--r--. 1 root root 0 Oca 14 00:46 bit
-rw-r--r--. 1 root root 0 Oca 14 00:46 bitik
-rw-r--r--. 1 root root 0 Oca 14 00:46 boat
-rw-r--r--. 1 root root 0 Oca 14 00:46 boot
-rw-r--r--. 1 root root 0 Oca 14 00:46 bOt
-rw-r--r--. 1 root root 0 Oca 14 00:46 bot

Hadi başlayalım.

[root@gnuadmin ~]# ls -l b[io]t
-rw-r--r--. 1 root root 0 Oca 14 00:46 bit
-rw-r--r--. 1 root root 0 Oca 14 00:46 bot

Yukarıdaki komutta şunu istiyoruz: “b” ile başlayan, ikinci karakteri “i” veya “o” olan ve son olarak “t” harfiyle biten dosyaları listele.

  • “*” ve “?” karakterinden farklı olarak, köşeli parantezler büyük – küçük harfe duyarlıdır (case sensitive). Bu nedenle “bOt” dosyası listelenmedi.
  • Köşeli parantezler, ikinci karakteri gösteriyor. Bu nedenle “boot” ve “boat” dosyaları listelenmedi.

Eğer “b” ile başlayan, “i” veya “o” ile devam eden ve “t” ile biten tüm dosyaları listelemek isteseydik, köşeli parantezleri yıldız ile birlikte kullanabilirdik:

[root@gnuadmin ~]# ls -l b[io]*t
-rw-r--r--. 1 root root 0 Oca 14 00:46 bit
-rw-r--r--. 1 root root 0 Oca 14 00:46 boat
-rw-r--r--. 1 root root 0 Oca 14 00:46 boot
-rw-r--r--. 1 root root 0 Oca 14 00:46 bot

Köşeli parantezleri birlikte kullanabiliriz:

[root@gnuadmin ~]# ls -l b[ai][lt][ıi]k
-rw-r--r--. 1 root root 0 Oca 14 00:46 balık
-rw-r--r--. 1 root root 0 Oca 14 00:46 batık
-rw-r--r--. 1 root root 0 Oca 14 00:46 bitik

“b” ile başlayan, “k” ile biten, ikinci karakteri “a veya i”, üçüncü karakteri “l veya t”, dördüncü karakteri “ı veya i” olan tüm dosyaları listelemiş olduk.

Yukarıdaki örneklerde hep 2 karakter verdik. Ancak böyle bir zorunluluk yok:

[root@gnuadmin ~]# ls -l b[abcdefgoABCDEFGO]t
-rw-r--r--. 1 root root 0 Oca 14 00:46 bet
-rw-r--r--. 1 root root 0 Oca 14 00:46 bOt
-rw-r--r--. 1 root root 0 Oca 14 00:46 bot

Köşeli parantezleri kullanırken karakter yerine bir aralık da verebiliriz:

[root@gnuadmin ~]# ls -l b[a-z]t
-rw-r--r--. 1 root root 0 Oca 14 00:46 bet
-rw-r--r--. 1 root root 0 Oca 14 00:46 bit
-rw-r--r--. 1 root root 0 Oca 14 00:46 bOt
-rw-r--r--. 1 root root 0 Oca 14 00:46 bot

DİKKAT! Aralık belirttiğimiz zaman büyük – küçük harf duyarlılığını kaybettik.

Aralık belirtirken, bu aralıkta olmayan harfleri kast etmemiz de mümkün. Bunun için aralığın başına “^” karakterini ekleyebiliriz:

[root@gnuadmin ~]# ls -l b[^ei]t
-rw-r--r--. 1 root root 0 Oca 14 00:46 bOt
-rw-r--r--. 1 root root 0 Oca 14 00:46 bot

“b” ile başlayan, “t” ile biten ancak ikinci karakteri “e” veya “i” olmayan dosyaları listeledik.

İşi biraz daha ilginçleştirelim:

[root@gnuadmin ~]# ls -l b[^oO]*[tl][i]*
-rw-r--r--. 1 root root 0 Oca 14 00:46 betik
-rw-r--r--. 1 root root 0 Oca 14 00:46 bitik

“b” ile başlayan, “o ve O” ile devam etmeyen, sonrasında bir noktada “t veya l” harfi geçen ve bu harflerin hemen sonrasında “i” harfi olan ve devamında bir şeyler yazan ya da yazmayan dosyaları listeledik.

Bence yeter 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.