Xóa các tệp không có chuỗi trong tên


9

Tôi muốn xóa các tệp không có chuỗi '999' (không có '') trong tên của chúng.

Tôi đã thử:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

Nhưng không ai trong số họ làm việc. Tôi đang sử dụng macOS Sierra, với bash: 3.2.57.


2
grep -llà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. grepluô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.
JoL

Câu trả lời:


18

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 extglobphả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 dotglobtù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 zshvỏ 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ì grepsẽ 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ó 999trong đó (bạn đã thêm --nulltù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ì greptrên macOS không hỗ trợ --null-data(tuy nhiên nó không có --nulltù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 999bấ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.


1
Bạn cũng muốn bật failglobtùy chọn hoặc cuối cùng có thể xóa tệp được gọi !(*999*)nếu không có tệp nào khác có tên không chứa 999.
Stéphane Chazelas

16

Chỉ cần đảo ngược điều kiện tên trong find:

find . -type f \! -name "*999*" 

Thêm -deletehoặc -exec rm {} +để thực sự loại bỏ các tập tin phù hợp.


2
!là an toàn trong bash.
Kusalananda
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.