Yanıtlar:
Feragat: Bu cevap özellikle Bash ile ilgilidir, ancak çoğu glob kalıpları ile ilgili soru için geçerlidir!
Yıldız karakteri ( *
) bir joker karakterdir. Yer alacağı belirli bir karakter kümesi vardır ve ilk karakter nokta ( .
) olmak bunlardan biri değildir. Bu, Unix dosya sistemlerinin nasıl çalıştığı nedeniyle, nokta ile başlayan dosyaların "gizli" olduğu düşünülen özel bir durumdur. Bunun anlamı gibi araçlar bu cp
, ls
açıkça bunu söylenmedikçe, vb onları "görmek" olmayacak.
Önce bazı örnek veriler oluşturalım.
$ mkdir .dotdir{1,2} regdir{1,2}
$ touch .dotfile{1,2} regfile{1..3}
Şimdi aşağıdakilere sahibiz:
$ tree -a
.
|-- .dotdir1
|-- .dotdir2
|-- .dotfile1
|-- .dotfile2
|-- regdir1
|-- regdir2
|-- regfile1
|-- regfile2
`-- regfile3
Şimdi bazı oyunlar oynayalım. echo
Belirli bir komut için belirli bir joker karakterin ( *
) nasıl olacağını listelemek için komutu kullanabilirsiniz :
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo reg*
regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2
$ echo .* *
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
$ echo .dotdir*
.dotdir1 .dotdir2
Bu tür dosyalara ek olarak aynı zamanda eşleşecek shopt -s dotglob
şekilde davranışını değiştirmek için komutu kullanabilirsiniz .*
regfile1
.dotfile1
bash
adam sayfasından alıntı
dotglob If set, bash includes filenames beginning with a `.' in the results
of pathname expansion.
Misal:
$ shopt -s dotglob
$ echo *
.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
Bu davranışı şu komutla geri alabilirsiniz:
$ shopt -u dotglob
$ echo *
regdir1 regdir2 regfile1 regfile2 regfile3
Sizin cp
için kalıpla eşleşen tüm dosyaları kopyalamak istediğinizi söylüyorsunuz *
ve herhangi bir dosya yok.
$ cp foo/.* .
Veya foo
klasördeki her şeyi istiyorsanız bunu yapabilirsiniz :
$ cp foo .
Veya açık olabilirsiniz:
$ cp foot/.* foo/* .
Brace genişlemesi kullanan daha kompakt bir form bash
:
$ cp foo/{.,}* .
İstediğiniz zaman echo
, önerilen dosya desenlerinizi (yıldızın bir parçası olduğu şey için süslü bir terim) görmek için hileyi kullanabilirsiniz .
$ echo {.,}*
. .. .dotdir1 .dotdir2 .dotfile1 .dotfile2 abc regdir1 regdir2 regfile1 regfile2 regfile3
Dosyaların + diğer dizinleri bir dizin kopyalamak için gidiyoruz arada eğer, genellikle olduğunu, yinelemeli bunu yapmak istiyor -R
anahtarı için cp
:
$ cp -R foo/. .
shopt -s dotglob
, echo *
sonra verir:.dotdir1 .dotdir2 .dotfile1 .dotfile2 regdir1 regdir2 regfile1 regfile2 regfile3
cp -r foo .
muhtemelen kendi kendine cp
kopyalamayı reddedeceğinden foo
, muhtemelen çalışmaz cp -R foo/. .
. ( cp -R
standart olanı unutmayın ).
zsh
içermez .
ve ..
genişlemesi de .*
. Gelen zsh
bir desen aynı değilse, komut (oldukça makul tekrar) iptal edilir, bu yüzden genel durumda cp foo/{,.}* .
hiçbir gizli ya da hiç olmayan gizli dosyaları varsa başarısız olur.
shopt
var olmayan zsh kullanıyor .
Bununla birlikte zsh
, tipik yol D
glob niteleyicisini kullanmaktır ([D] ot dosyalarını dahil etmek için):
cp foo/*(D) .
D
Zsh glob'lu veya onsuz , asla ( .
ne ..
beklediğiniz gibi) içermez .
Kabuk, karakteri çözdüğünde bu dosyalara gizli olarak davranır *
, bu nedenle cp
bu dosya adlarından hiçbirini bağımsız değişken olarak almaz.
Bunları açıkça belirterek kopyalayabilirsiniz. cp foo/.* .
Yapmak istediğiniz şey tüm dosyaları ve dizinleri bir yerden başka bir yere kopyalamaksa, standart rsync
komutu kullanabilirsiniz . Yukarıda verdiğiniz örnekte:
mkdir foo && touch foo/.test
rsync -a foo/ .
foo
gizli dosyalar ve gizli dizinler dahil tüm içeriğini tekrar tekrar geçerli dizine kopyalar . Sonundaki sondaki eğik çizgi foo/
rsync için önemlidir; onunla sadece içeriği foo
kopyalanır, onsuz da kopyalanır foo
. Örneğin:-
mkdir src && mkdir dest && touch src/.test
rsync -a src dest // copies 'src' contents to 'dest/src'
rsync -a src/ dest // copies 'src' contents to 'dest'
Makineler arasında kopyalama da dahil olmak üzere başka birçok seçenek var.
dotglob
çevrilirglobdots
tarafından zsh için geçersiz seçenek adıdır bash .