|
fazlamesai
|
 |
« : Ağustos 09, 2007, 01:08:05 ÖS » |
|
Günlük Linux kullanımında çok defa bir operasyonu tek seferde birden fazla nesne için çalıştırmak isteyebileceğiniz (rm gibi) durumlarla karşılaşabilirsiniz. Böyle durumlarda, aşağıdaki gibi bütün dosyaları komut satırına yazmak çok gereksizdir:
$ rm dosya1 dosya2 dosya3 dosya4 dosya5 dosya6 dosya7 dosya8
Bu problemi çözmek için, Linux'un kendi içinde yer alan joker karakter desteğinin getirdiği avantajdan yararlanabilirsiniz. Aynı zamanda (tarihsel nedenlerden dolayı) \globbing" olarak da adlandırılan bu destek, joker karakter modelini kullanarak tek seferde birden fazla dosyayı belirlemenize olanak sağlar. Bash ve diğer Linux komutları joker karakter modeline bakarak ve dosya sistemi üzerinde bu modele uyan dosyaları bularak komutu yorumlar. Bu durumda diyelim ki bulunduğumuz dizinde dosya1, dosya2, ... , dosya8 isimli dosyalar varsa bu dosyaları aşağıdaki şekilde yok edebilirsiniz:
$ rm dosya[1-8]
Ya da daha basitçe ismi dosya ile başlayan bütün dosyaları yok etmek istediğinizde aşağıdaki gibi yazabilirsiniz:
$ ls -d /etc/g* /etc/gateways /etc/gconf /etc/gdm /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-2.0 Uyuşmazlıkları (non-matches) Anlamak
/etc/gnome-vfs-mime-magic /etc/gpm-root.conf
/etc/grep-dctrl.rc /etc/groff /etc/group /etc/group.org /etc/gs.Fontmap Veya /etc içinde yer alan ve ismi g ile başlayan tüm nesneleri listelemek istediğinizde aşağıdaki gibi
/etc/gshadow /etc/gtansrc /etc/gtk /etc/gtk-2.0 /etc/guid-resolv.conf
Peki ya acaba herhangi dosya sistemi nesnesi ile uyuşmayan bir yol belirlendiğinde ne olacaktır? Aşağıdaki örnekte, /usr/bin altında yer alan, asdf ile başlayan ve jkl ile biten bütün dosyaları listelemek istiyoruz:
$ ls -d /usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl: Böyle bir dosya ya da dizin yok
Uyuşmazlıkları Anlamak, devamı
Bu durumu şöyle açıklayabiliriz. Normalde mevcut dosya sisteminde yer alan bir ya da daha fazla nesne ile uyuşan bir model belirlediğimizde kabuk, yazdığımız modeli her uyuşan nesne boşlukla ayrılacak şekilde listeler. Fakat model herhangi bir nesne ya da nesnelerle uyuşmuyorsa, kabuk ifadeyi olduğu gibi bırakır. Ve sonuçta ls, /usr/bin/asdf*jkl dosyasını bulamaz ve hata verir. Buradaki kural şudur: Kullanılan model, sadece modelin belirlediği nesne ya da nesneler sistemdeki nesnelerle uyuşuyorsa açılmaktadır.
Joker karakter sözdizimi: *
Artık joker karakterlerin nasıl çalıştığını anladığımıza göre, biraz da joker karakterlerin sözdizimine göz atalım. joker karakterler arasında birkaç özel karakter kullanabilirsiniz; işte bunlardan bir tanesi:
* Yıldız (asterix) * işareti sıfır veya daha fazla karakterle eşleşecektir. Bunun anlamı * olan yere herhangi bir şey gelebileceğidir. örnekler:
/etc/g* belirtimi /etc'nin altında g ile başlayan tüm nesnelerle eşleşir. ı /tmp/my*1 beliritim /tmp'nin altında my ile başlayan ve 1 ile biten tüm nesnelerle eşleşir.
Joker karakter sözdizimi:
Soru işareti ' ?' herhangi bir tek karakterle eşleşir. örnekler:
dosyam? belirtimi dosyam ile başlayıp bir tane daha karakter içeren nesnelerle eşleşir.
/tmp/notlar?txt belirtimi hem /tmp/notlar.txt, hem /tmp/notlar txt dosyasıyla eşleşir, eğer mevcutlarsa.
Joker karakter sözdizimi:
Bu joker karakterler ' ?' ile benzerdir, ancak daha fazla kesinlikte ayrım yapma şansını verir. Bu joker karakterleri kullanmak için, [] arasında eşlemek istediğiniz tüm karakterleri koymalşınız. Sonuçta elde edilen eşleşme bu karakterlerin herhangi birinin tek eşleşmesini verecektir. - (eksi) işaretini bir aralık vermek için kullanabilirsiniz, hatta birden fazla aralığı birlikte kullanabilirsiniz. örnekler:
dosyam[12] belirtimi dosyam1 ve dosyam2 ile eşleşecektir. Wildcard, çalışılan dizindeki en bu dos yalardan en az bir tanesi mevcut olacak şekilde genişletilecektir.
[Cc]hange[Ll]og belirtimi Changelog, ChangeLog, changeLog, ve changelog ile eşleşecektir. Gördü ı günüz gibi, köşeli parantez joker karakterlerini kullanmak küçük / büyük harf eşleşmelerindeki kombinasyonları yakalamak için faydalı olacaktır.
ls /etc/[0-9]* komutu /etc 'nin altında rakamla başlayan tüm dosyaları listeler.
ls /tmp/[A-Za-z]* komutu /tmp 'nin altında küçük ya da büyük har e başlayan tüm dosyaları listeler.
Joker karakter sözdizimi:
[!] yaps [] yapsınabenzemektedir. Ancak bu sefer [] parantezde yer alan karakterle eşleştirme yerine, parantezler içerisinde bulunmayan karakterler ile eşleştirme yapılmaktadır.
• Ornekler:
rm dosyam[!9]
bu komut ismi dosyam9 olan dosya dışındaki tüm dosyaları yok eder.
Joker karakter ile ilgili uyarılar
Burada joker karakter kullanırken dikkat edilmesi gereken bazı noktalara değineceğiz. Bash wildcard ile ilgili karakterler (?, [, ], *) yazıldığı zaman buna göre özel bir işlem yapacağından, bir komuta parametre geçirirken bu karakterler kullanılacaksa dikkat edilmelidir. örneğin, [fo]* ifadesini içeren bir dosya yaratmak istediğimizde aşağıdaki yazılı olan komut yapmak istediğimiz şeyi gerçekleştirmeyecektir:
$echo [fo]* > /tmp/yenidosyam.txt
Eğer [fo]* modeli, dizin içerisinde herhangi bir dosya ile eşleşiyorsa, bu durumda /tmp/yenidosyam.txt dosyası içerisinde görmeyi beklediğiniz [fo]* ifadesi yerine bu eşleşen dosyaları göreceksiniz. O halde ı cözüm nedir? Bunun için gerekli çözümlerden birisi karakterlerinizi tek tırnak içerisinde yazmanızdır. Bu yaklaşım, kabuğa bu karakterler üzerinde hiç bir joker karakter işlemi yapmaması gerektiğini anlatır.
$echo '[fo]*' > /tmp/yenidosyam.txt
Joker karakter ile ilgili uyarılar,
Bu yaklaşımı kullandığınızda yeni dosyanız beklediğiniz gibi [fo]* karakter dizimini içerecektir. Alternatif olarak, ters bölü (backslash) kullanarak karakterlerinizin bash için, joker karakter yerine normal karakter anlamına gelmesini sağlayabilirsiniz. (escape characters)
$ echo \[fo\]\* > /tmp/yenidosyam.txt
Yukarıda anlatılan her iki yaklaşımda aynı şekilde çalışacaktır. Ters bölü (backslash) karakterinin bu ı sekilde kullanımından da bahsettiğimize göre, eğer karakter olarak backslash (n) kullanmak istiyorsanız bunu tek tırnak içinde ya da nnşeklinde yazabileceğinizi söyleyebiliriz.
Tek Tırnak ile Çift Tırnağın Kıyaslanması
Çift tırnağın da tek tırnakla aynı şekilde çalışacağını bilmelisiniz, fakat şunu da belirtmek gerekir ki çift tırnak tek tırnağa benzer bir şekilde çalışsa da kabuğunu bazı sınırlı genişletme işlemlerine izin verir. Bu yüzden, yukarıda da gösterilen joker karakter olarak da anlamlı ifadeleri komut olarak kullanacaksanız en iyi seçim tek tırnak olacaktır. Eğer joker karakter genişletmesine ilişkin daha ayrıntılı bilgi edinmek istiyorsanız komut satırında man 7 glob yazınız. Tırnak kullanımına ilişkin daha fazla bilgi edinmek istiyorsanız komut satırında man 8 glob yazarak QUOTING başlıklı bölümü okuyunuz.
|