*
là một quả địa cầu được mở rộng bởi vỏ. Theo mặc định, shell không bao gồm các tệp có tên bắt đầu bằng .
(được gọi là tệp ẩn hoặc dấu chấm) trừ khi mục .
nhập được nhập theo nghĩa đen.
*
hoặc [.]*
hoặc ?*
hoặc *.*
hoặc dir/*
sẽ không bao gồm dotfiles.
.*
hoặc dir/.*
sẽ
Vì vậy, bạn có thể làm:
mv -- * .* /dest/
tuy nhiên, một số shell bao gồm bash
(nhưng không zsh
, mksh
cũng không fish
) có sự không thỏa đáng rằng việc mở rộng .*
bao gồm các mục thư mục đặc biệt .
và ..
mà bạn không muốn ở đây (và nói chung không bao giờ muốn một quả cầu bao gồm đó là lý do tại sao tôi gọi nó là không phù hợp).
Vì lý do đó, bạn sẽ thấy rằng đôi khi mọi người sử dụng (trong các vỏ giống như Bourne):
mv -- * .[!.]* ..?* /dest/
Đó là ba quả cầu, cái đầu tiên khớp với các tệp không bị ẩn, tên tệp thứ hai bắt đầu .
bằng một ký tự khác .
và tên tệp thứ ba bắt đầu ..
bằng ít nhất một ký tự.
Tuy nhiên, một số vỏ hiện đại có những cách tốt hơn xung quanh đó
zsh
Với zsh
, bạn có thể sử dụng (D)
vòng loại toàn cầu để chỉ định rằng toàn cầu nên bao gồm các dotfiles:
mv -- *(D) /dest/
zsh
cũng đã sửa lỗi không phù hợp khác của shell Bourne ở chỗ nếu mẫu không khớp, mv
lệnh không được chạy.
Như đã nói ở trên, nó cũng sẽ không bao giờ bao gồm .
cũng như ..
trong các khối của nó, vì vậy
mv -- * .* /dest/
Sẽ được an toàn. Tuy nhiên, nếu không có tệp phù hợp *
hoặc không có tệp phù hợp với .*
lệnh sẽ bị hủy bỏ, vì vậy sẽ tốt hơn nếu sử dụng:
mv -- (*|.*) /dest/
Giống như trong một số shell khác, bạn cũng có thể buộc tất cả các khối được bao gồm các dotfiles (ví dụ nếu bạn thấy mình muốn các dotfile được bao gồm thường xuyên hơn không) với:
setopt dotglob
hoặc là:
set -o dotglob
Sau đó, nếu bạn muốn một quả cầu cụ thể không bao gồm dotfiles, bạn có thể viết nó:
echo *(^D)
Hoặc là:
echo [^.]*
Bash
Thật không may bash
, không có vòng loại toàn cầu. Vì vậy, bạn còn lại với việc kích hoạt bao gồm dotfile trên toàn cầu. Trong bash
, cú pháp là:
shopt -s dotglob
(và sử dụng [^.]*
cho các khối mà không có tập tin ẩn).
Với dotglob
, bash
không bao gồm .
cũng không bao gồm ..
trong ảm đạm như *
, nhưng vẫn làm cho ảm đạm như thế .*
.
Nếu bạn đặt GLOBIGNORE
biến thành một thứ gì đó không trống, thì nó sẽ tự động kích hoạt dotglob
tùy chọn và loại trừ .
và ..
từ các khối .*
nhưng không phải từ dir/.*
hoặc .*/file
một số (!) Để việc bảo vệ là vô ích. Bạn có thể làm GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
nhưng sau đó nó sẽ phá vỡ những đống như */.
hoặc ./*
hoặc ../*
.
Một công việc tốt hơn là sử dụng [.]*
hoặc dir/[.]*
hoặc [.]*/file
(có dotglob
bật) để mở rộng các dotfiles ngoại trừ .
và ..
.
cá
fish
quả cầu không bao gồm .
cũng không ..
. Khi không có kết quả khớp, tùy thuộc vào phiên bản, nó sẽ hoạt động như zsh
(hoặc bash -o failglob
) hoặc bash -o nullglob
.
mv -- * .* /dest/
Sẽ hoạt động nếu có cả tệp ẩn và tệp không ẩn. Mặt khác, YMMV và với một số phiên bản, nó có thể gọi mv -- /dest
nếu không có tệp nào cả.
ksh93
Không có vòng loại toàn cầu trong ksh93
một trong hai. Bạn có thể bao gồm các dotfiles trong các khối với:
FIGNORE='@(.|..)'
Trái với bash
s' GLOBIGNORE
, đó là thực hiện đúng cách và cũng có thể sửa chữa vấn đề của .*
bao gồm .
và ..
.
yash
yash
có một dot-glob
tùy chọn ( set -o dot-glob
), nhưng trái với bash
, mở rộng toàn cầu (thậm chí *
) bao gồm .
và ..
vì vậy nó khá vô dụng.
tcsh
set globdot
Hoạt động như trong bash
, *
bao gồm các tệp chấm trừ .
và ..
nhưng .*
vẫn bao gồm .
và ..
(và bạn có thể sử dụng [.]*
để mở rộng các tệp ẩn ngoại trừ .
và ..
).