linux find lệnh chỉ giữ các tệp .h


-1

Tôi có một cây nguồn có rất nhiều tệp với các loại tệp khác nhau. Cây nguồn có nhiều thư mục con. Làm cách nào để giữ cấu trúc thư mục của cây nguồn và xóa tất cả các tệp bên cạnh các tệp .h?

Câu trả lời:


2

Bạn có thể dùng find với các vị ngữ phủ định cho điều này. Về cơ bản, tạo một lệnh tìm tất cả các tệp mà bạn muốn giữ, phủ nhận (các) điều kiện phù hợp (sao cho nó khớp với các tệp bạn không muốn giữ) và bảo nó xóa các tệp đó hoặc đơn giản là di chuyển chúng ra khỏi đường đi.

Ví dụ: lệnh này sẽ in danh sách tất cả các tệp trong thư mục hiện tại, bao gồm các thư mục con, có tên kết thúc bằng .h:

find . -type f -name '*.h' -print

(Các -type f hạn chế chỉ khớp với các tệp thông thường; không phải thư mục, nút thiết bị, vân vân. Các trích dẫn xung quanh *.h là quan trọng.)

Bây giờ, đảo ngược điều kiện tên để in tất cả các tệp làm không phải có tên kết thúc bằng .h:

find . -type f -not -name '*.h' -print

(Lưu ý rằng -not không tuân thủ POSIX, nhưng ở đây sạch hơn vì nó không yêu cầu thoát vỏ. Bạn cũng có thể sử dụng tiêu chuẩn POSIX ! thay vào đó, nhưng ít nhất bash yêu cầu điều đó ! được trốn thoát.)

Một khi bạn hài lòng danh sách các tệp khớp với những gì bạn muốn xóa, chỉ cần thay thế -print với -delete để thực sự xóa các tập tin. Hoặc, nếu bạn cần một giải pháp POSIX (một lần nữa), bạn có thể sử dụng -exec rm '{}' '+' thay vì -delete, với chi phí gọi rm một số lần không xác định.


Cảm ơn rất nhiều! Có phương pháp nào tốt để xóa các thư mục không có tệp trong không?
srjohnhuang

Tôi nghĩ rằng tôi biết làm thế nào để làm điều đó "tìm. -Empty -type d -print"
srjohnhuang

1

Bạn có thể thực hiện điều đó bằng một lệnh đơn giản:

find . -not -name *.h -exec rm -r "{}" \;

Nếu bạn muốn chắc chắn rằng nó sẽ xóa những gì bạn thực sự muốn, bạn có thể xóa -exec một phần và chỉ cần thêm -print cờ để xem những gì phù hợp. Khi bạn chắc chắn, bạn có thể nối thêm -exec rm -r "{}" \; phần.

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.