Gần đây tôi đã phải đối mặt với nhiệm vụ xóa tất cả các tệp / thư mục trong một thư mục không bao gồm những tệp phù hợp với một mẫu cụ thể. Vì vậy, tôi đã tạo ra một lệnh unix một dòng để thực hiện công việc. Nó phải chỉ là một dòng? Tôi cho là không, nhưng nó chắc chắn mát hơn theo cách đó!
Trong khi vấn đề khá đơn giản, tôi hơi ngạc nhiên về sự phức tạp của giải pháp của mình. Đây là lệnh tôi đã sử dụng; LƯU Ý: đây là một giải pháp kém vì nó không xử lý tên tệp có chứa các ký tự nguồn cấp dữ liệu (điều này không quan trọng trong tình huống của tôi).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Tôi đã không sử dụng lệnh "find" vì tôi không muốn lặp lại vào các thư mục khớp với MẪU. Ví dụ, hãy xem xét cấu trúc tệp sau:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
Sử dụng mẫu "foo" chỉ phải xóa "first_dir" (và tất nhiên đó là nội dung) và "somefile.txt" ( không phải "Anotherfile.txt" hoặc "morefiles.log").
Câu hỏi, có cách nào tốt hơn (thanh lịch và chính xác hơn) để thực hiện điều này?
EDIT:
Gần đây tôi đã nhận thấy rằng "tìm" có thể là một lựa chọn tốt hơn :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Giải pháp này xử lý chính xác các đường dẫn chứa các ký tự nguồn cấp dữ liệu.