Tại sao rm * (1) * xóa tất cả các tệp trong một thư mục?


47

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?


5
Bất cứ khi nào tôi sử dụng rmvới một mẫu, tôi luôn đi trước nó echotrướ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ữa DEL A: *.*DEL *.* A:).
gerrit

Câu trả lời:


51

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 1s - đó 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 extglobkí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-completionvô 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.


7
Lưu ý rằng extglobkhô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. bashkhông có phạm vi địa phương cho các tùy chọn như zshkhông.
Stéphane Chazelas

1
Cũng lưu ý rằng bash-4.3có một hồi quy trong đó *(1)*cũng mở rộng các tập tin ẩn.
Stéphane Chazelas

@StephaneChazelas Bạn có liên kết cho lỗi liên quan đến hồi quy đó không? Cảm ơn
cơ bản

2
@Basic, bạn đi đây . Chet chưa trả lời.
Stéphane Chazelas

9

Điều này có lẽ liên quan đến extglobtù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 echohoặ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 :)


FYI: {là một nẹp, (là một paren (hoặc khung tròn).
Mikel

À, cảm ơn. Tôi không phải là người nói tiếng Anh bản địa nên tôi có xu hướng nhầm lẫn họ :)
Martin von Wittich

6
Trong tiếng Anh: {= 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.
Mikel

4
@Mikel Cảm ơn, tôi cũng đã kiểm tra ở đây vì vậy bây giờ tôi biết về dấu ngoặc hoa và những cái sóc !

Trong tiếng Anh Ấn Độ, {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. :-)
ShreevatsaR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.