Sử dụng mô hình hình cầu mở rộng trong bash
:
rm ./!(*999*)
Điều này đòi hỏi shopt -s extglob
phải được kích hoạt (và để đảm bảo an toàn, shopt -s failglob
để không có tệp nào có tên bất thường !(*999*)
bị xóa do nhầm lẫn nếu tất cả tên tệp có chứa 999
). Mẫu !(*999*)
sẽ khớp với bất kỳ tên nào trong thư mục hiện tại, ngoại trừ những tên phù hợp *999*
. Để xóa các tệp ẩn (các tệp có tên bắt đầu bằng dấu chấm ), cũng bật dotglob
tùy chọn.
Để chỉ quan tâm đến các tệp thông thường hoặc liên kết tượng trưng đến các tệp thông thường (không phải thư mục, v.v.):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
Các zsh
vỏ tương đương với vòng lặp trên sẽ là
rm ./(^(*999*))(.)
Lệnh đầu tiên của bạn sẽ không hoạt động vì grep
sẽ nhìn vào bên trong các tệp. Nó sẽ xóa tất cả các tệp có dòng mà không có 999
trong đó (bạn đã thêm --null
tùy chọn để nó hoạt động với xargs -0
).
Lệnh thứ hai của bạn sẽ không hoạt động vì grep
trên macOS không hỗ trợ --null-data
(tuy nhiên nó không có --null
tùy chọn, nhưng chỉ dành cho khi tạo đầu ra tên tệp). Cũng lưu ý rằng nó sẽ tìm 999
bất cứ nơi nào trong đường dẫn của tệp (bao gồm các thành phần thư mục), không chỉ tên của tệp.
grep -l
làm cho nó liệt kê các tệp nơi tìm thấy kết quả khớp (hoặc không tìm thấy-v
) trong nội dung , không phải tên tệp.grep
luôn khớp với nội dung của các tệp bạn chỉ định, không bao giờ là tên của chúng.