Làm cách nào để sử dụng find để xóa các tệp * .py ~ và * .pyc cùng một lúc?


7

Tôi muốn dọn sạch một thư mục (và thư mục con) từ mỗi lần xuất hiện của tệp .py.pyc. Tôi đã thử như sau

find . -name '*pyc' -o -name '*py~' -exec rm -f {} \;

mà bỏ đi tất cả pyccác tập tin. Khi làm

find . -name '*pyc' -o -name '*py~'

lệnh tìm các pyctập tin không bị xóa. Bất kỳ hiểu biết?

Câu trả lời:


10

Thay vì sử dụng -otại sao không chỉ làm một mẫu ký tự đại diện?

find . -name '*py[c~]' -delete

hoặc là:

find . -name '*py[c~]' -exec rm -f {} +

2
Điểm tốt cho trường hợp cụ thể này. Lưu ý rằng đó không phải là biểu thức chính quy, đó vẫn là mẫu ký tự đại diện.
Stéphane Chazelas

Ahh, tôi luôn hiểu họ là như nhau. Cảm ơn đã sửa nó.
h3rrmiller

10

Các -anhà điều hành (ngầm giữa hai vị từ) có ưu tiên hơn -o, vì vậy bạn cần ngoặc:

find . \( -name '*pyc' -o -name '*py~' \) -a -exec rm -f {} +

(Tôi chỉ bao gồm -aở trên cho mục đích trình diễn, nó không cần thiết vì nó là ẩn). Tôi đã thay thế ;bằng +vì có lẽ không có điểm nào chạy một rmtệp trên mỗi tệp nếu điều đó có thể tránh được.


1
Tại sao bạn không sử dụng -delete?
Aif

6
@Aif, vì -deletekhông phải là một lựa chọn tiêu chuẩn. Bằng mọi cách, hãy sử dụng nó nếu bạn findhỗ trợ, nhưng không sử dụng nó trong các tập lệnh có nghĩa là có thể mang theo được.
Stéphane Chazelas

findrất giống với Perl. Mạnh mẽ đáng kinh ngạc, nhưng chỉ viết.
Plutor

@StephaneChazelas Ôi tôi không biết! Tôi có nó dưới OSX trên cả find và gnu-find, vì vậy tôi nghĩ rằng "nếu ngay cả BSD find cũng có nó, thì nó phải di động!".
Aif

0

Nếu bạn có bash 4+, bạn thậm chí không cần tìm, vì globalstar sẽ cung cấp cho bạn toàn cầu đệ quy:

shopt -s globstar
for f in ./**/*.py{c,~}; do rm "$f"; done

Lưu ý rằng shoptcần phải nằm trên một dòng riêng của nó, thay vì được phân tách bằng một ;(và nên được sử dụng ở đầu tập lệnh, ngay bên dưới shebang nếu có thể).


0

Tôi biết rằng câu hỏi không quá mới ... nhưng có lẽ nó đã đủ để sử dụng

rm -f `find . -name '*.pyc' -o -name '*.py~' `
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.