dosya aramada * kullanımı


9

linux dosya arama hakkında okurken aşağıdakileri aldım ...

* Joker karakterini kullanarak dosya aramak için bilinmeyen dizeyi * ile değiştirin, örneğin yalnızca uzantının .out olduğunu hatırlıyorsanız, ls * .out yazın.

ve sistemde aşağıdaki komutu denediğimde (ubuntu 14.04 LTS) ..

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

ilk durumda neden böyle bir dizin ( *.bash*) göstermiyor ve bir sonraki durumda dosyaları ( .bash*) gösteriyor

Ben bu lezzet için yeni, ve benim otomata teorisi sınıfları (*) göre epsilon (boş) dahil dizelerin herhangi bir kombinasyonu anlamına gelir, Peki neden her iki durumda da sonuçları farklı ....?

Yanıtlar:


11

Bunu yaptığınızda genişletilmiş ediliyor önce o geçirilir . Yani, biz üç dosya var (eğer demek ki , ve ) bir dizin içinde fiilen çalıştığı .ls **lsabcls *ls a b c

Bash genişleyemediğinde, ham dizgeden geçer¹. Bu yüzden hatada joker karakterleri ve bulunmayan bir mesajı görürsünüz. lstam anlamıyla çağrılan bir dosyanın listesini göstermeye çalıştı *.bash*.

Peki bu neden genişlemedi? Varsayılan olarak globbing (bu joker karakter genişletmesine ne denir) gizli dosyaları döndürmez. Bunu şu şekilde değiştirebilirsiniz shopt -s dotglob(eğer yapışmazsanız devam etmeyecektir .bashrc- iyi bir nedenden dolayı varsayılan olarak devre dışı bırakılabilir, bu yüzden dikkatli olun), hızlı bir demo:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Bunun istisnası, daha önce gösterdiğiniz gibi - dosyaların açıkça belirttiğinizde dosyaların benzer bir desenle gizleneceğini ifade eder .bash*. Sadece varsayılan dotglobayarı geçersiz kılar :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Her neyse, bu tuhaflığın yanında, umarım bu, yüzeyin altında neler olduğunu anlamanıza yardımcı olur.


Diğer vardır shopteserlerini globbing nasıl değiştirebilir bayrakları: extglob, failglob, globstar, nocaseglobve nullglob. Onlar ve diğer shoptbayraklar bir sal Bash kılavuzunun bir parçası olarak belgelenmiştir .

Benzer şekilde, Desen Eşleştirme sayfasındaki bazı iyi okumalar gerekir.

¹ failglobveya nullglobayarlanmadığı sürece .


thanx @Oli ,, Bahsettiğim gibi tüm bu alamadım bu lezzet için yeniyim ,, ama bunun% 80'i var ... Bana yardımcı oldu
lazarus
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.