Tôi mong chờ rằng:
$ rm *(1)*
sẽ loại bỏ tất cả các tập tin có chứa (1)
trong tên. Tôi đã sai. Nó loại bỏ tất cả các tập tin trong thư mục.
Tại sao?
Tôi mong chờ rằng:
$ rm *(1)*
sẽ loại bỏ tất cả các tập tin có chứa (1)
trong tên. Tôi đã sai. Nó loại bỏ tất cả các tập tin trong thư mục.
Tại sao?
Câu trả lời:
Từ man bash
:
*(pattern-list)
Matches zero or more occurrences of the given patterns
Bạn có một biểu thức toàn cục khớp với các tệp bắt đầu bằng 0 hoặc nhiều 1
s - đó là tất cả các tệp.
Một cách đơn giản để vô hiệu hóa hành vi toàn cầu này là \
thoát khỏi dấu ngoặc đơn:
rm *\(1\)*
Nếu không, bạn có thể sử dụng shopt -u extglob
để vô hiệu hóa hành vi và shopt -s extglob
kích hoạt lại:
shopt -u extglob
rm *(1)*
shopt -s extglob
Lưu ý rằng như Stephane nói , extglob
được kích hoạt bằng cách bash-completion
vô hiệu hóa nó có thể khiến các chức năng hoàn thành không hoạt động đúng.
extglob
không được bật theo mặc định nhưng được bật bởi bash_completion nếu bạn đã cài đặt và bật. bash
không có phạm vi địa phương cho các tùy chọn như zsh
không.
bash-4.3
có một hồi quy trong đó *(1)*
cũng mở rộng các tập tin ẩn.
Điều này có lẽ liên quan đến extglob
tùy chọn vỏ. Nếu tôi tắt nó, mẫu sẽ tạo ra một thông báo lỗi:
martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('
Nếu tôi bật nó lên, nó thực sự phù hợp với mọi thứ. Các trang tài liệu các mẫu này, tôi nghĩ rằng chúng có liên quan:
If the extglob shell option is enabled using the shopt builtin, several
extended pattern matching operators are recognized. In the following
description, a pattern-list is a list of one or more patterns separated
by a |. Composite patterns may be formed using one or more of the fol‐
lowing sub-patterns:
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
Tôi không thấy bất kỳ tài liệu nào chỉ định dấu ngoặc đơn mà không có ký tự đầu làm. Dù sao, bạn có thể phá vỡ vấn đề bằng cách trích dẫn các parens:
martin@dogmeat ~ % echo *\(1\)*
A(1)b
Ngoài ra, sử dụng echo
hoặc ls
để kiểm tra mẫu của bạn trước nếu bạn không chắc chắn rằng nó hoạt động :)
{
là một nẹp, (
là một paren (hoặc khung tròn).
{
= ngoặc vuông, (
= khung tròn, [
= khung vuông. Trong tiếng Mỹ: {
= brace, (
= paren, [
= ngoặc. Một chút bối rối. Nếu bạn cần kiểm tra cái gì đó được gọi là, Jargon File - ASCII khá hữu ích.
{
là một khung hoa, [
là một khung vuông và (
là một khung tròn hoặc phổ biến hơn chỉ là khung. :-)
rm
với một mẫu, tôi luôn đi trước nóecho
trước khi ban hành lệnh thực tế. Thói quen đã cứu tôi hơn một lần (từ khi 6 tuổi trở lên, gây nhầm lẫn giữa sự khác biệt giữaDEL A: *.*
vàDEL *.* A:
).