*
adalah bola yang diperluas oleh shell. Secara default, shell tidak menyertakan file yang namanya dimulai dengan .
(disebut file atau dotfile tersembunyi) kecuali jika yang .
dimasukkan dimasukkan secara harfiah.
*
atau [.]*
atau ?*
atau *.*
atau dir/*
tidak akan mencakup dotfiles.
.*
atau dir/.*
akan.
Jadi Anda bisa melakukan:
mv -- * .* /dest/
namun beberapa kerang termasuk bash
(tetapi tidak zsh
, mksh
atau fish
) memiliki misfeature bahwa ekspansi .*
termasuk .
dan ..
entri direktori khusus, yang Anda tidak ingin di sini (dan umumnya tidak pernah ingin gumpal untuk memasukkan itulah sebabnya saya menyebutnya misfeature a).
Untuk alasan itu, Anda akan menemukan bahwa kadang-kadang orang menggunakan (dalam cangkang mirip Bourne):
mv -- * .[!.]* ..?* /dest/
Itu tiga gumpalan, yang pertama cocok dengan file yang tidak tersembunyi, yang kedua nama file dimulai dengan .
diikuti oleh karakter selain .
dan yang ketiga nama file dimulai dengan ..
diikuti oleh setidaknya satu karakter.
Namun beberapa shell modern memiliki cara yang lebih baik
zsh
Dengan zsh
, Anda dapat menggunakan (D)
kualifikasi glob untuk menentukan bahwa glob harus menyertakan dotfile:
mv -- *(D) /dest/
zsh
juga memperbaiki kesalahan lain dari shell Bourne di bahwa jika polanya tidak cocok, mv
perintah tidak dijalankan.
Seperti dikatakan di atas juga tidak akan pernah termasuk .
atau ..
dalam gumpalannya, jadi
mv -- * .* /dest/
akan aman. Namun jika tidak ada file yang cocok *
atau tidak ada file yang cocok .*
dengan perintah akan dibatalkan, jadi akan lebih baik untuk menggunakan:
mv -- (*|.*) /dest/
Seperti pada beberapa shell lainnya, Anda juga dapat memaksa semua gumpalan untuk memasukkan dotfile (misalnya jika Anda mendapati dotfile ingin lebih sering dimasukkan daripada tidak) dengan:
setopt dotglob
atau:
set -o dotglob
Setelah itu, jika Anda ingin glob tertentu tidak menyertakan dotfiles, Anda dapat menulisnya:
echo *(^D)
Atau:
echo [^.]*
Pesta
Sayangnya bash
tidak memiliki kualifikasi glob. Jadi, Anda harus mengaktifkan inklusi dotfile secara global. Dalam bash
, sintaksnya adalah:
shopt -s dotglob
(dan gunakan [^.]*
untuk gumpalan tanpa file tersembunyi).
Dengan dotglob
, bash
tidak termasuk .
atau ..
dalam gumpalan suka *
, tetapi masih untuk gumpalan suka .*
.
Jika Anda mengatur GLOBIGNORE
variabel ke sesuatu yang tidak kosong, maka secara otomatis mengaktifkan dotglob
opsi dan mengecualikan .
dan ..
dari .*
gumpalan tetapi tidak dari dir/.*
atau .*/file
yang (!) Sehingga perlindungan cukup berguna. Anda bisa melakukannya GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
tetapi kemudian akan merusak gumpalan seperti */.
atau ./*
atau ../*
.
Cara lain yang lebih baik adalah menggunakan [.]*
atau dir/[.]*
atau [.]*/file
(dengan dotglob
diaktifkan) untuk memperluas dotfile kecuali .
dan ..
.
ikan
fish
gumpalan tidak termasuk .
juga ..
. Ketika tidak ada kecocokan, tergantung pada versinya, itu akan berfungsi seperti zsh
(atau bash -o failglob
) atau bash -o nullglob
.
mv -- * .* /dest/
Akan berfungsi jika ada file yang tersembunyi dan tidak tersembunyi. Jika tidak, YMMV dan dengan beberapa versi, ia dapat memanggil mv -- /dest
jika tidak ada file sama sekali.
ksh93
Tidak ada kualifikasi glob di ksh93
keduanya. Anda dapat memasukkan dotfile dalam gumpalan dengan:
FIGNORE='@(.|..)'
Bertentangan dengan bash
itu GLOBIGNORE
, itu dilakukan dengan benar dan juga memperbaiki masalah .*
termasuk .
dan ..
.
yash
yash
memiliki dot-glob
opsi ( set -o dot-glob
), tetapi bertentangan dengan bash
, ekspansi glob (bahkan *
) termasuk .
dan ..
jadi sangat tidak berguna.
tcsh
set globdot
Bekerja seperti dalam bash
, yaitu *
menyertakan file titik kecuali .
dan ..
tetapi .*
masih termasuk .
dan ..
(dan Anda dapat menggunakan [.]*
untuk memperluas file tersembunyi kecuali .
dan ..
).