-delete
ngụ ý -depth
rằng nó không hoạt động với -prune
( -depth
bắt đầu với những chiếc lá). Có một cảnh báo về điều đó trong hướng dẫn sử dụng phiên bản GNU ( -delete
hiện là phần mở rộng FreeBSD cũng được GNU find
và một số triển khai khác hỗ trợ ).
info find --index-search=-delete
Việc sử dụng hành động '-delete' trên dòng lệnh sẽ tự động bật tùy chọn '-depth' (* lưu ý tìm Biểu thức: :). Điều này có thể gây ngạc nhiên nếu trước đây bạn chỉ thử nghiệm với '-print', vì vậy tốt nhất nên nhớ sử dụng '-depth' một cách rõ ràng.
info find --index-search=-prune
Bởi vì '-delete' ngụ ý '-depth', sử dụng '-prune' kết hợp với '-delete' có thể dẫn đến việc xóa nhiều tệp hơn bạn dự định.
Tại đây, bạn đã có tùy chọn sử dụng rm
thay thế:
find . -name save -prune -o -type f -exec rm -f {} +
(có khả năng không an toàn nếu có thư mục có thể ghi bởi những người khác trong đó, vì người ta có thể khiến bạn xóa các tệp bên ngoài cây thư mục hiện tại bằng cách thay thế các thư mục bằng symlink trong khi bạn chạy lệnh đó).
Một sự thay thế an toàn hơn:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
Điều đó không có vấn đề được đề cập ở trên nhưng có nghĩa là chạy một rm
tệp cho mỗi tệp. Điều --
này là cần thiết cho việc triển khai FreeBSD, không phải là GNU có tiền tố tên tệp ./
.
Ngoài ra, theo đề xuất của Costas:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(nhưng điều đó vẫn không cần phải đi vào save
thư mục)
Cái LC_ALL=C
này *
phù hợp với bất kỳ chuỗi byte nào (ngay cả những byte không tạo thành các ký tự hợp lệ trong miền địa phương hiện tại). Lưu ý rằng nó sẽ ảnh hưởng đến ngôn ngữ của thông báo lỗi (tiếng Anh thay vì ngôn ngữ của người dùng).
mv save/ ../some/safer/location
trước lệnh xóa "chung" như vậy (... nhưng tất nhiên, trước bài đăng của bạn, tôi đã thực hiện kiểm tra tương tự và gặp rắc rối tương tự!). Bây giờ, hãy tìm một "phục hồi" tốt cho hệ thống tệp mà các tệp đã được bật ^^