Yanıtlar:
ls
Argüman olarak iletilen dizinlerin dosyalarını ve içeriğini listeler ve argüman verilmezse, geçerli dizini listeler. Davranışını etkileyen bir dizi seçenek de geçebilir ( man ls
ayrıntılar için bakınız).
Eğer ls
adlandırılan bir argüman geçirildiği için *
, adı bir dosya veya dizini arar *
geçerli dizinde ve sadece diğerleri gibi sıralar. karaktere, diğerinden daha farklı şekilde ls
davranmaz *
.
Bununla birlikte ls *
, bir kabuk komut satırı ise, kabuk *
karşılık gelen kabuğun toparlanmasına ( Dosya Adı Oluşturma veya Dosya Adı Genişletme olarak da bilinir ) kurallarına göre genişler .
Farklı mermiler farklı globbing operatörlerini desteklerken, çoğu en basit olanı üzerinde anlaşır *
. *
Bir model *
olarak glob
, geçerli dizinlerdeki o modelle eşleşen dosyaların listesine genişleyeceği şekilde herhangi bir sayıda karakter anlamına gelir . Bununla birlikte, bir .
dosya adındaki baş nokta ( ) karakterinin açıkça eşleştirilmesi gerektiğinin bir istisnası vardır, bu nedenle *
aslında .
(sözlüksel sırayla) başlamamış dosya ve dizin listesine genişler .
Geçerli dizin adı verilen dosyaları içeren Örneğin, eğer .
, ..
, .foo
, -l
ve foo bar
, *
geçmek iki argümanları kabuk tarafından genişletilecek ls
: -l
ve foo bar
o yazdığınız sanki olacak, böylece:
ls -l "foo bar"
veya
'ls' "-l" foo\ bar
Tamamen aynı komutu çalıştırmak için üç yol. Her 3 durumda da, ls
komut (muhtemelen içinde /bin/ls
belirtilen dizinlerin aranmasından itibaren yürütülecektir $PATH
) şu 3 argümandan geçecektir: "ls", "-l" ve "foo bar".
Bu arada, bu durumda, ls
ilk (kesinlikle ikinci konuşan ) birini bir seçenek olarak ele alacağım .
Şimdi dediğim gibi, farklı mermilerin farklı globbing operatörleri var. Birkaç yıl önce, zsh
tanıtılan **/
kısaca, alt dizinleri herhangi bir düzeyde maç için anlamı operator¹ (*/)#
ve ***/
dizinleri inen ederken sembolik bağları takip haricinde aynı olan.
Birkaç yıl önce (Temmuz 2003, ksh93o+
), ksh93
bu davranışı kopyalamaya karar verdi, ancak isteğe bağlı hale getirmeye karar verdi ve yalnızca durumu ele aldı **
(değil ***
). Ayrıca, **
tek başına özel değildi zsh
(sadece *
diğer geleneksel kabuklarda olduğu gibi aynı **
anlama geldiğinden, herhangi bir sayıda karakterin ardından gelen herhangi bir sayıda karakter anlamına gelir), ksh93'de, (geçerli dosyanın altındaki herhangi bir dosya veya dizinin **
aynısı) **/*
(gizli dosyalar hariç).
bash
Kopyalanan ksh93
birkaç yıl sonra (Şubat 2009, bash 4.0) aynı sözdizimi ama talihsiz bir farkla: bash en **
gibiydi zsh
's ***
alt dizinleri içine recursing zaman bunu yapmak istediğini genelde olmadığı sembolik takip ediyordu, yani ve kötü yan etkileri olabilir. Kısım 4.3'te, semboliklerin hala takip edildiği, ancak özyineleme orada durduğu için kısmen düzeltildi. 5.0'da tamamen sabitlendi.
yash
seçeneği **
ile etkinleştirilmiş, 2008 yılında 2.0 sürümünde eklendi extended-glob
. Uygulanmasına daha yakın zsh
olduğu için **
tek başına özel değildir. 2.15 (2009) sürümünde , kendi uzantılarının ***
içindekiler zsh
ve ikisi gibi eklenmiştir : .**
ve .***
yinelemede gizli dizinler eklemek (içeride zsh
, D
glob niteleyicisi ( içeride olduğu gibi **/*(D)
) gizli dosyaları ve dizinleri göz önünde bulundurur, ancak yalnızca gizli öğeleri geçmek istiyorsanız dirs ancak gizli dosyaları genişletmeyin, ihtiyacınız olan ((*|.*)/)#*
veya **/[^.]*(D)
).
Balık kabuk da destekler **
. Daha önceki sürümlerde olduğu gibi bash
dizin ağacını inerken sembolik izleri izler. Ancak bu kabukta **/*
aynı değildir **
. **
bunun bir uzantısı *
birkaç dizine yayılabilir. Olarak fish
, **/*.c
maç olacak a/b/c.c
ancak a.c
ederken, a**.c
maç olacak a.c
ve ab/c/d.c
ve zsh
'nin **/.*
örneğin yazılacak vardır .* **/.*
. Burada, ***
olarak anlaşılmalıdır **
ardından *
şekilde aynı **
.
tcsh
Ayrıca eklenen globstar
V6.17.01 (2010 Mayıs) seçeneği ve destekler **
ve ***
la à zsh
.
Yani içinde tcsh
, bash
ve ksh93
, (ilgili seçeneği etkinleştirildiğinde ( globstar
)) ya da fish
, **
mevcut olanın altına tüm dosyaları ve dizinleri genişler ve ***
aynıdır **
için fish
kateden bir sembolik bağ, **
için tcsh
birlikte globstar
ve aynı *
içinde bash
ve ksh93
bu kadar olsa ( Bu mermilerin gelecekteki versiyonlarının da sembolik bağlantıları geçmesi imkansız değil).
Yukarıda, genişletmelerin hiçbirinin bir seçenek olarak yorumlanmadığından emin olma gereğini fark ettiniz. Bunun için yapardın:
ls -- *
Veya:
ls ./*
Bazı dosya isimleriyle ls
bile --
özel olarak ele alınabildiğinden ikincinin tercih edilebileceği bazı komutlar vardır (önemli değil ) . Bu -
, çoğu metin yardımcı programında cd
ve örneğin karakterini pushd
içeren dosya adlarında geçerlidir . Tüm argümanlara hazırlık yapmak, özel anlamlarını kaldırır (en azından yukarıda belirtilen durumlar için).=
awk
./
Aynı zamanda en kabukları ayrıca bkz, (herhangi bir eşleşme varsa ne yapacağını, sıralama düzeni nokta dosyaları göz ardı edilip gibi ya da değil, ...) globbing davranışını etkileyen çeşitli seçenekler var olduğunu belirtmek gerekir $FIGNORE
parametre içindeksh
Ayrıca, her kabukta ama csh
, tcsh
, fish
ve zsh
eğer globbing desen herhangi bir dosyayı uymuyor, desen karışıklık ve muhtemelen böcek neden olan bir genişlememe argüman olarak geçirilir. Örneğin, geçerli dizinde gizli olmayan bir dosya yoksa
ls *
Aslında ls
iki argüman ile arayacak ls
ve *
. Ve hiçbir dosya olmadığı için, hiçbiri de çağrılmadı *
, ls'den (kabuk değil) gelen bir hata mesajı göreceksiniz : ls: cannot access *: No such file or directory
ki bu, insanların ls
aslında bunun dünyayı genişlettiğini düşünmesini sağladı .
Sorun, aşağıdaki gibi durumlarda daha da kötüdür:
rm -- *.[ab]
Hiçbir varsa *.a
ne de *.b
geçerli dizinde dosyayı, o zaman adlı bir dosya silme sonunda olabilir *.[ab]
yanlışlıkla ( csh
, tcsh
ve zsh
bir rapor verecek hiçbir eşleşme hatası ve demezdim rm
(ve fish
desteklemez [...]
joker)).
Eğer bir değişmez geçirmek istediğiniz yoksa *
üzere ls
, bunu belirtmek zorunda *
olduğu gibi bir şekilde karakterini ls \*
veya ls '*'
veya ls "*"
. POSIX benzeri mermilerde globbing tamamen set -o noglob
veya kullanılarak set -f
( devre dışı bırakılmadıkça / zsh
çalışmaz ) çalışmaz .sh
ksh
Always Her (*/)#
zaman desteklenirken ilk önce ..../
zsh-2.0'da (ve potansiyel olarak önce) olduğu gibi kısa yoldan, daha sonra ****/
da 2.1'de **/
(1992 başlarında) kesin biçimini almadan önce 2.1 olarak verildi.
find -name *
. Özellikle daha karmaşık modellerle, geçerli dizinde tam olarak bir eşleşme olursa, insanlar genellikle yıldız işaretini geçmediklerini farketmeyeceklerdir find
.
*.[ab]
biten her şeyi silmeye çalışırdım .[ab]
. [
balıklarda özel değildir.
Komut ls
varsayılan olarak ls .
: Geçerli dizindeki tüm girişleri listeler .
Komut ls *
' *
Kabuk düzeninin genişlemesinde ls çalıştır' anlamına gelir.
*
Desen kabuk tarafından işlenir ve bir ile başlayan olanlar hariç olmak üzere, geçerli dizindeki tüm girişlere genleşir .
. Bir seviye derin gidecek.
İkili veya üçlü *
modellerin yorumlanması, kullanılan gerçek kabuğa bağlıdır.
*
0 veya daha fazla karakterle eşleşen bir joker karakterdir. Bazı modern kabukları, **
deseni görünce alt dizinlere taşınır .
*
şey eklemek dışında , globtarı açıklayan diğer cevaba bakınız. Ayrıca , yıldızlarla hiçbir ilgisi olmadığı, bu yıldızlardan hiçbiri geçmediği açıkça belirtilmelidir . Yazarken echo ls *
ne yürütüleceğini görmek için koş ls *
.
Komutun neye genişlediğini görmek için önce echo
yerine yazarak işlemin tamamını silinebilirsiniz ls
:
$ echo *
Applications Downloads Documents tmp.html
Yani bu durumda, ls *
genişlerls Applications Downloads Documents tmp.html
$ echo **
Applications Downloads Documents tmp.html
$ echo ***
Applications Downloads Documents tmp.html
Yani değişiklik yok. Bu bash
, kabuğunuz olarak kullandığınızı varsayar - çoğu insan ve farklı mermilerin farklı davranışları vardır. Kullanıyorsanız ash
veya csh
veya ksh
veya kullanıyorsanız zsh
, işlerin farklı şekilde çalışmasını bekleyebilirsiniz. Farklı mermilere sahip olmanın amacı budur.
Öyleyse farklı bir şeyi deneyelim (hala ile bash
), böylece globbing ( *
) operatörünün bizim için yapabileceği hakkında bir fikir edinebiliriz . Örneğin, adın bir bölümüne göre filtreleyebiliriz:
$ echo D*
Downloads Documents
Ve ilginç bir şekilde, sondaki eğik çizgi, herhangi bir dizin adının örtük olarak bir parçasıdır. Dolayısıyla */
, yalnızca dizinleri (ve dizinlere sembolik linkleri) verir:
$ echo */
Applications/ Downloads/ Documents/
Ve ortada eğik çizgiler koyarak birkaç düzeyde bazı filtreler yapabiliriz:
$ echo D*/*/
Documents/Work/ /Documents/unfinished/
Yana Downloads
dizin tüm alt içermez, bu çıktıda kadar bitmez. Bu sadece istediğiniz dosyaları incelemek için çok kullanışlıdır. Bu gibi komutları her zaman kullanırım:
$ ls -l /home/*/public_html/wp-config.php
Bu, varsa, herhangi wp-config.php
bir kullanıcının public_html
dizininin temel düzeyinde bulunan tüm dosyaları listeler . Ya da belki daha eksiksiz olmak için:
$ find /home/*/public_html/ -name wp-config.php
Bu, herhangi bulacaksınız wp-config.php
herhangi bir kullanıcının dosyaları public_html
dizinleri veya bunların alt dizinleri herhangi fakat daha verimli sadece daha çalışacaktır find /home/ -name wp-config.php
bir şey incelemek çünkü ancakpublic_html
kullanıcıların her biri için dizinleri.
bash
, kabuğunuz olarak kullandığınızı varsayar " ← ve globstar'ın etkin olmadığını. shopt -s globstar
ve tekrar deneyin ...
set -x
kaldırılmasının bir başka yolu da, her seferinde yürütülen "gerçek" komutunu basmaya başlamasıdır (kapat set +x
).
globstar
Seçeneği etkinleştirilmiş bash 4.x dahil olmak üzere bazı kabuklarda, **
eşleşen dizinleri azalan özyinelemeli bir glob gerçekleştirir. Ek yıldız işaretleri bu işlemi daha fazla değiştirmez.
ksh93
ve zsh
, bash
genellikle istenmeyen olduğu özyinelemede travers sembolik yapar.
Eğer "derinlere dalmak" istiyorsanız, ls -R (özyinelemeli) seçeneğini kullanın veya şunun gibi bul:
find . -ls
"find", dizin ağacının altına ('ls -R' de olduğu gibi) dalacak ve dizinleri (-type d) listeleme, sadece dosyaları (-type f) ya da diğer dosyaları gösterme gibi daha birçok seçeneğe sahip olacak özellikleri (/ etc / passwd'de kullanıcı yok, belirli izinler ve daha fazlası). "find" komut dosyası için de biraz daha güvenlidir (mermiler arasındaki tutarsız globbing kurallarının yanı sıra, kısa çizgi içeren dosyalar için özel çıkışlar vb.).
shell joker globbing, dotfiles üzerinde sadece '*' yıldız işaretiyle çalışmaz. Yalnızca nokta dosyalarını listelemek için şunu kullanın:
ls .??*
Ekstra * derinlik seviyesi eklemiyor. Ama denersen
ls */*/*
- Geçerli klasördeki klasörlerdeki alt klasörlerin listesini alırsınız ...
*
s derinlik seviyesi ekleyecektir.
bash
Globstar seçeneği ile GNU dahil , korn shell ve zsh. Ve muhtemelen diğerleri, sanırım. unix.stackexchange.com/a/62665/14831
Benim ana kavrama yankı ** / *. Ext genellikle ...
Mayıs ya da Mayıs: geçerli dizinde bir .ext dosyasını listeleyebilir
Mayıs veya Mayıs değil: içer. *. Ext dosyaları
Genelde, glob ifadesinin '** /' olmasını ve boş bir dizeyle sonuçlanabileceğini (alt dizin yok) tercih ederim. Bu, program girişindeki glob ifadelerini böyle dönüştürür. Tabii ki bunu kullanım örneklerinde açıklayan yorumlar olduğunu garanti ediyorum.