Unix không phải là DOS. Không có trường "mở rộng" đặc biệt trong tên tệp. Bất kỳ ký tự nào sau dấu chấm chỉ là một phần của tên và được gọi là hậu tố. Có thể có nhiều hơn một hậu tố, ví dụ: .tar.gz
. Ký tự shell glob *
đối sánh trên các ký tự .
; nó là không biết đến hậu tố. Vì vậy, MS-DOS *.*
chỉ là *
Trong Unix.
Hầu như. *
không khớp với tệp bắt đầu bằng .
. Đối tượng được đặt tên với một dấu chấm đầu tiên, theo quy ước, "ẩn". Chúng không hiển thị trong ls
hoặc trừ khi bạn chỉ định -a
.
(Điều này có nghĩa rằng .
và ..
mục thư mục cho "tự" và "mẹ" được coi là ẩn.)
Để phù hợp với mục ẩn cũng có, sử dụng .*
Lệnh rm
không loại bỏ các thư mục (khi không hoạt động đệ quy với -r
). Hãy thử rm <directory>
và xem. Ngay cả khi thư mục trống, nó sẽ từ chối.
Vì vậy, cách bạn loại bỏ tất cả (không giấu) các tập tin, đường ống, thiết bị, ổ cắm và liên kết tượng trưng từ một thư mục (nhưng để lại các thư mục con một mình) là trong thực tế:
rm /path/to/directory/*
để cũng loại bỏ những người bị ẩn bắt đầu bằng .
:
rm /path/to/directory/{*,.*}
Cú pháp này là cú đúp mở rộng. Brace mở rộng không phù hợp với mô hình; nó chỉ là một cách ngắn gọn để tạo nhiều đối số, trong trường hợp này:
rm /path/to/directory/* /path/to/directory/.*
lần mở rộng này diễn ra trước tiên và sau đó là hình cầu để tạo ra tên cần xóa.
Lưu ý rằng các giải pháp khác nhau được đăng ở đây có vấn đề khác nhau:
find /path/to/directory -type f -delete
# -delete is not Unix standard; GNU find extension
# without -maxdepth 1 this will recurse over all files
# -maxdepth is also a GNU extension
# -type f finds only files; so this neglects to delete symlinks, fifos, etc.
Các GNU tìm ra giải pháp có lợi ích mà họ làm việc ngay cả khi số lượng các mục thư mục bị xóa là rất lớn: quá lớn để vượt qua trong một một cuộc gọi đến rm
. Một lợi ích khác là việc xây dựng trong -delete
không có vấn đề với đi qua tên đường dẫn buồn cười với một lệnh bên ngoài.
Cách giải quyết di động cho các vấn đề của quá nhiều mục thư mục là lập danh sách các mục với ls
và ống để xargs
:
(cd /path/to/directory ; ls -a | xargs rm --)
Các dấu ngoặc đơn có nghĩa là "làm những lệnh trong một tiểu trình"; theo cách này ảnh hưởng của cd
bị lãng quên, điều này rất hữu ích trong việc viết kịch bản. ls -a
bao gồm các tệp ẩn.
Hiện tại, chúng tôi bao gồm --
sau rm
có nghĩa là "đây là tùy chọn cuối cùng; mọi thứ khác là đối số không tùy chọn". Điều này bảo vệ chúng tôi chống lại các mục nhập thư mục có tên không thể phân biệt được từ các tùy chọn. Điều gì nếu một tập tin được gọi là -rf
và kết thúc lập luận đầu tiên? Sau đó, bạn có rm -rf ...
sẽ thổi tắt các thư mục con.
là câu trả lời duy nhất? Tôi ngạc nhiên rằng rm không thể xử lý điều này mà không đưa ra cảnh báo vì nó có vẻ giống như một hoạt động đơn giản như vậy – toop
có gì sai với 'find'? Tôi hiểu rằng nó có vẻ hơi clunky, nhưng tốt hơn nên giữ 'rm' đơn giản và' tìm' clunky hơn là yêu cầu mọi tính năng được thêm vào 'rm' (render nó giống như clunky như' find') – Shep