[Co] có nghĩa là gì trong tên tập tin rm -rf [r]


16

Giả sử tôi có hai tệp trong /tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

Bây giờ, hãy chạy rm -rflệnh với tùy chọn [co]

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

Ai đó có thể vui lòng giải thích những gì đang xảy ra ở đây? Là gì [co]tham số? Làm thế nào chúng ta có thể làm cho nó hoạt động cho các phần mở rộng khác? Nói tôi có foo.jsfoo.coffeecác tập tin, chúng ta có thể làm gì đó rm -rf /tmp/foo.coffe[co]để xóa /tmp/foo.js?


8
Không cần -rfở đó, vì chúng không phải là thư mục ( --recursive), cũng không phải là không thể đọc được ( --force).
deltab

13
Không cần -rfvà cũng không cần phải làm mọi thứ như root. Đặc biệt là nếu những điều trong câu hỏi liên quan rm -rf.
terdon

Các bạn, nó chỉ là các lệnh mẫu để giải thích vấn đề. Câu hỏi thực tế là về [co]vỏ toàn cầu. Cảm ơn.
aneeshep

8
@aneeshep Nếu ai đó nhìn xuống nòng súng và hỏi cách làm sạch nó, trước tiên bạn có cảnh báo họ về việc nhìn xuống nòng súng hay nói với họ cách làm sạch nó không?
Duncan X Simpson

Câu trả lời:


34

[co]không phải là một tham số cho rmlệnh - đó là một hình cầu vỏ khớp với một mẫu bằng với một ký tự trong tập hợp [co]- nói cách khác, nó khớp với một choặc omột phần cuối của tên tệp. Từ man bash:

[...]  Matches any one of the enclosed characters

Để phù hợp với cả hai foo.coffeefoo.js, kể từ khi hậu tố không chứa bất kỳ chuỗi con chung ở tất cả, tốt nhất bạn có thể làm là foo.*mà sẽ phù hợp với bất kỳ tên tập tin bắt đầu với foo.Thay vào đó bạn có thể sử dụng cú đúp mở rộng ví dụ

rm foo.{coffee,js}

Yup hiểu rồi Tôi đã bỏ lỡ khái niệm cơ bản trong bash;). Cảm ơn bạn :)
aneeshep

7
tìm kiếm các mẫu như [abc]hoặc *sẽ tìm kiếm các tập tin trong khi {}sẽ không. đi tới / tmp, gõ echo nya[ab]; echo nya{a,b}, sau đó touch nyaavà một lần nữaecho nya[ab]; echo nya{a,b}
Sanya_Zol

16

Nó không phải là một tham số mà là một tập hợp các chữ cái (hoặc "shell global"). Điều này giống nhau:

rm -rf /tmp/hello.py[co]

giống như

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

Giống ...

rm -rf /tmp/hello.py[c-o]

sẽ xóa mọi thứ từ /tmp/hello.pyctối đa và bao gồm cả /tmp/hello.pyosau khi đặt hàng ASCII.

rm -rf /tmp/hello.py[ab][cd]

sẽ xóa ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

giả sử, tôi có các tệp foo.js và foo.coffee, chúng ta có thể làm gì đó rm -rf /tmp/foo.coffe[co]để xóa /tmp/foo.js.

Bạn có thể tạo các phương thức khá lạ mắt nhưng đối với 2 tệp đó, tôi chỉ cần xóa chúng bằng 1 lệnh cho mỗi tệp. Một ví dụ khác càng gần càng tốt với 2 tệp đó ...

rm /tmp/foo.[cj]*

sẽ xóa các tệp như thế này ...

rm /tmp/foo.c*
rm /tmp/foo.j*

vì vậy nó sẽ bao gồm nhiều hơn chỉ là 2 tập tin này.


2
Nếu tôi không hiểu lầm, bạn sẽ nhận được một lời mời rm -rfvới tất cả các trận đấu, không có nhiều lời mời mỗi trận đấu.

1
Đúng. nhưng không phải là ý định của rm tôi đã thêm. những thứ đó chỉ để thể hiện những gì cần thiết để được gõ như một thứ tương đương ;-)
Rinzwind

1

Đó là một vỏ toàn cầu, tương tự như ký tự đại diện *?... trong bash, mẫu tên tệp *.[co]khớp với tất cả các tên tệp kết thúc bằng .choặc .o.

Sự khác biệt *.[co]so với *.c *.ohoặc *.{c,o}là hai mẫu sau sẽ mở rộng thành hình nộm *.onếu không có .otệp nào tồn tại trong thư mục, trong khi *.[co]phiên bản sẽ không.

Shell Globs rất hữu ích để thực hiện các thao tác tệp theo cách không phân biệt chữ hoa chữ thường. Ví dụ, nếu bạn có một loạt các tập tin với tên tập tin kết thúc bằng jpg, JPG, Jpg, JPg, vv ... và bạn muốn loại bỏ tất cả trong số họ, bạn có thể làm:

rm *.[Jj][Pp][Gg]
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.