Làm cách nào để xóa tất cả các tệp .pyc khỏi dự án?


677

Tôi đã đổi tên một số tệp trong một dự án khá lớn và muốn xóa các tệp .pyc mà chúng đã bỏ lại. Tôi đã thử tập lệnh bash:

 rm -r *.pyc

Nhưng điều đó không lặp lại qua các thư mục như tôi nghĩ. Tôi đang làm gì sai?


11
Nó không hoạt động bởi vì trong UNIX, các khối được mở rộng bằng vỏ chứ không phải bởi chương trình đang chạy. Nếu bạn có a.pyc và b.pyc trong thư mục hiện tại và thư mục foo và bar, rmsẽ được gọi với các đối số [-r, a.pyc, b.pyc].
ephemient

1
nếu bạn lo lắng về việc đẩy mã của mình cho người khác, bạn chỉ cần thêm nó vào .gitignore **/*.pycthì bạn sẽ không phải lo lắng về điều đó nữa
bubakazouba

Câu trả lời:


1165
find . -name "*.pyc" -exec rm -f {} \;

384
Find có một hành động "-delete" dựng sẵn, vì vậy bạn có thể làm ngayfind . -name \*.pyc -delete
Christoffer

51
Quan trọng nhất, nếu đây là máy dev, bạn có thể đặt PYTHONDONTWRITEBYTECODE = True và bạn sẽ không bao giờ phải làm điều này nữa. Xem: câu trả lời này .
mlissner

5
Bạn không trích dẫn {}. Điều gì sẽ xảy ra nếu vô tình tách từ và xóa một đường dẫn trung gian được gọi là một đoạn của đường dẫn bạn tìm thấy?
Robottinosino

20
-deletekhông phải là một phần của đặc tả POSIX và không được bảo đảm tồn tại trong tất cả các triển khai find.
chepner

7
Nếu bạn sợ - điều đó có thể tốt - hãy vượt qua lần đầu tiên với -exec echo {} hoặc - nếu bạn rất sợ - hãy sử dụng rm -i {} để hỏi bạn mỗi lần hoặc rm - v {} để bạn thấy điều gì bạn xóa.
jeanM

1021

find . -name '*.pyc' -delete

Chắc chắn là đơn giản nhất.


21
Nếu phiên bản findhỗ trợ của bạn -delete; nó không phải là một phần của tiêu chuẩn POSIX.
chepner

4
Điều này bỏ qua các tập tin và __pycache__thư mục .pyo . Xem câu trả lời của tôi.
Wilfred Hughes

Tôi đã sử dụng mã từ câu trả lời được chấp nhận và nó đã hoạt động, nhưng các lệnh này ngắn hơn và đơn giản
Dap

3
-name '*.py?'bao gồm.pyo, .pyc,...
cdosborn

2
MAKE SURE -delete là điều cuối cùng trong lệnh. Tôi vô tình đặt -delete ngay sau khi tìm thấy. Nó xóa mọi thứ!
thinkanotherone

85

Trong phiên bản hiện tại của debian, bạn có pycleantập lệnh được python-minimalđóng gói.

Cách sử dụng rất đơn giản:

pyclean .

34
Điều đáng chú ý là pyclean dường như chỉ xóa các tệp .pyc có tệp .py tương ứng (ít nhất là trên hệ thống của tôi - ubfox 12.10.) Điều này có nghĩa là nó không hữu ích lắm trong trường hợp tệp nguồn bị xóa và bạn muốn để dọn sạch các tập tin .pyc còn sót lại.
tigerFinch

@holms pyclean(và bây giờ py3clean) bắt nguồn từ gói Debian, và do đó không có trong RHEL.
duozmo

83

Thêm vào của bạn ~/.bashrc:

pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}

Thao tác này sẽ xóa tất cả các tệp .pyc và .pyo và __pycache__thư mục. Nó cũng rất nhanh.

Cách sử dụng đơn giản là:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -deletethường sẽ đưa ra cảnh báo về một đường dẫn bị thiếu vì rõ ràng nội dung sẽ được thêm vào hàng đợi trước khi thư mục bị xóa. 2>/dev/nullnên sửa cái đó
Nhà vật lý điên

53

Nếu bạn đang sử dụng bash> = 4.0 (hoặc zsh)

rm **/*.pyc

Lưu ý rằng */*.pycchọn tất cả .pyccác tệp trong thư mục con cấp đầu tiên ngay lập tức trong khi **/*.pycquét đệ quy toàn bộ cây thư mục. Ví dụ, foo/bar/qux.pycsẽ bị xóa bởi rm **/*.pycnhưng không phải bởi */*.pyc.

Các tùy chọn vỏ globalstar phải được bật. Để bật globstar:

shopt -s globstar

và để kiểm tra trạng thái của nó:

shopt globstar

1
Có gì khác biệt khi chạy rm **/*.pycso với rm */*.pyc? (Cái sau dường như làm việc cho tôi tại địa phương.)
Taylor Edmiston

1
@TaylorEdmiston rm */*.pycsẽ xóa tất cả .pyccác tệp trong tất cả các thư mục con có độ sâu 1. rm **/*.pycsẽ xóa tất cả .pyccác tệp trong tất cả các thư mục con có độ sâu 0+
Adam Stewart

@AdamStewart Cảm ơn bạn đã thêm điều này. Đối với những người khác vấp phải chủ đề này, vấn đề tôi gặp phải là bash của Apple được cung cấp cùng với OS X không bao gồm toàn cầu (vì vậy **hoạt động như *khi chạy thay thế và chạy shopt globstarsẽ gây ra lỗi).
Taylor Edmiston

30

Tôi đã từng sử dụng một bí danh cho điều đó:

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'

12
Trong debian hiện tại, nó là pyclean.
jb.

7
Điều này không đối phó với khoảng trắng trong tên tệp tốt. Bạn nên sử dụng find -print0xargs -0thay vào đó.
r3m0t

2
Tại sao bạn muốn có mã python có khoảng trắng trong tên tệp / thư mục? Đó có phải là cú pháp hợp pháp?
coredumperror

@CoreDumpError, vâng, trên thực tế, trên Windows Python cài đặt vào một thư mục có khoảng trắng ("Tệp chương trình").
Paul Draper

Trình thông dịch python có thể cài đặt ở đó theo mặc định, nhưng hầu như không phải là nơi tốt để đặt của bạn . Thêm vào đó, bạn chắc chắn sẽ không muốn thư mục Tệp chương trình là một phần của cấu trúc gói của bạn, đó là lý do tại sao tôi cảnh giác về cú pháp.
coredumperror

24

Đối với người dùng windows:

del /S *.pyc

Đặt điều này trong một tập lệnh bó làm cho mọi thứ siêu dễ dàng. Cảm ơn.
Nick Gotch

Và nếu bạn đang ở trên Powershell, điều này có thể được sử dụng với "cmd" -> Lệnh Run -> "exit".
np8

18
find . -name '*.pyc' -print0 | xargs -0 rm

Việc tìm đệ quy tìm kiếm các tệp * .pyc. Các xargs lấy danh sách tên đó và gửi nó đến rm. -Print0 và -0 cho hai lệnh tách biệt tên tệp bằng ký tự null. Điều này cho phép nó hoạt động chính xác trên các tên tệp chứa khoảng trắng và thậm chí tên tệp chứa một dòng mới.

Giải pháp với -exec hoạt động, nhưng nó tạo ra một bản sao mới của rm cho mỗi tệp. Trên một hệ thống chậm hoặc với nhiều tệp tuyệt vời, việc đó sẽ mất quá nhiều thời gian.

Bạn cũng có thể thêm một vài đối số:

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

iname thêm trường hợp không nhạy cảm, như * .PYC. No-run-if-blank giúp bạn không gặp lỗi từ rm nếu bạn không có các tệp như vậy.


16
$ find . -name '*.pyc' -delete

Cái này nhanh hơn

$ find . -name "*.pyc" -exec rm -rf {} \;

11

Hơn nữa, mọi người thường muốn xóa tất cả *.pyc, *.pyocác tệp và __pycache__thư mục đệ quy trong thư mục hiện tại.

Chỉ huy:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Đây là một câu trả lời tốt, nhưng một giải pháp Python đơn giản sẽ là đa nền tảng và do đó thích hợp hơn. Trong khi, về mặt cá nhân, tôi không quan tâm đến Windows có lẽ một nửa dân số Python sống trên Windows - và find, grepvà bạn bè không làm việc ở đó.
Peterino

Họ làm nếu bạn cài đặt dụng cụ. Tôi muốn giới thiệu mọi cửa sổ Người dùng CLI làm như vậy để dễ dàng so sánh chéo: superuser.com/questions/168202/iêu
DylanYoung

8

Chỉ cần ném một biến thể khác vào hỗn hợp, bạn cũng có thể sử dụng các backquote như thế này:

rm `find . -name *.pyc`

5
Điều này có một nhược điểm nhỏ là thất bại nếu có quá nhiều trận đấu, vì sẽ có quá nhiều đối số để vượt qua rm.
chepner


7

đệ quy đầy đủ

ll **/**/*.pyc
rm **/**/*.pyc

Thật thú vị, làm thế nào điều này so sánh với câu trả lời của Andy và Bill?
Austin Henley

3
Một bộ **là không cần thiết, và như trong d0kcâu trả lời của bạn, bạn phải kích hoạt sao trên bash 4+ để nó hoạt động như dự định. tức là làm shopt -s globstarhoặc có trong một bash có nguồn gốc của bạn. các tập tin.
Xin hãy phục hồi lại

1
Cũng llthường được đặt bí danh cho một cái gì đó như ls -l, nhưng không thực sự là một lệnh hoặc di động. Vì vậy, để liệt kê đệ quy tất cả .pyccác tệp trong ., thay vào đó, bạn nên làm một cái gì đó giống như echo **/*.pycđược kích hoạt trên toàn cầu
Phục hồi Monica Vui lòng

3

Lần chạy đầu tiên:

find . -type f -name "*.py[c|o]" -exec rm -f {} +

Sau đó thêm:

export PYTHONDONTWRITEBYTECODE=1

Tới ~ / .profile


3

nếu bạn không muốn .pyc nữa, bạn có thể sử dụng dòng đơn này trong một thiết bị đầu cuối:

export PYTHONDONTWRITEBYTECODE=1

nếu bạn đổi ý:

unset PYTHONDONTWRITEBYTECODE

2

rm -rđệ quy vào các thư mục, nhưng chỉ các thư mục bạn cung cấp cho rm. Nó cũng sẽ xóa các thư mục đó. Một giải pháp là:

for i in $( find . -name *.pyc )
do
  rm $i
done

findsẽ tìm thấy tất cả các tệp * .pyc theo cách đệ quy trong thư mục hiện tại và forvòng lặp sẽ lặp qua danh sách các tệp được tìm thấy, loại bỏ từng tệp.


Cái này hoạt động mặc dù tôi phải đặt nó trong tệp .sh và chạy nó (điều này cũng ổn đối với tôi, tôi sẽ sử dụng lệnh này nhiều lần)
Teifion

Tôi tin rằng đặt tất cả trên một dòng tách biệt với ';' sẽ cho phép bạn chạy nó ở trình bao. Nhưng khi tôi gõ nó trong bash, bash sẽ đợi "xong" ở cuối để thực thi bất cứ điều gì ...
Chris Lutz

Đó là một antipotype khủng khiếp (và cũng rất phổ biến, tôi ước nó có thể biến mất): nó bị vỡ với tên tệp chứa khoảng trắng hoặc ký tự hình cầu. Và nó bỏ lỡ quan điểm findvới -execvị từ của nó : find . -name '*.pyc' -exec rm {} +(đẹp hơn, ngắn hơn, an toàn hơn, mạnh mẽ hơn, hiệu quả hơn).
gniourf_gniourf


1

Bạn có thể chạy find . -name "*.pyc" -type f -delete.

Nhưng sử dụng nó với sự đề phòng. Chạy trước find . -name "*.pyc" -type fđể xem chính xác những tập tin bạn sẽ loại bỏ.

Ngoài ra, hãy chắc chắn rằng -delete là đối số cuối cùng trong lệnh của bạn. Nếu bạn đặt nó trước đối số -name * .pyc, nó sẽ xóa mọi thứ.


1

Nếu bạn muốn xóa tất cả các tệp .pyc khỏi thư mục dự án.

Đầu tiên, bạn có

cd <path/to/the/folder>

sau đó tìm tất cả các tập tin .pyc và xóa.

find . -name \*.pyc -delete
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.