プロジェクトからすべての.pycファイルを削除するにはどうすればよいですか?


677

かなり大きなプロジェクトの一部のファイルの名前を変更し、それらが残した.pycファイルを削除したいと考えています。私はbashスクリプトを試しました:

 rm -r *.pyc

しかし、私が思っていたように、それはフォルダーを再帰しません。何が悪いのですか?


11
UNIXでは、グロブは実行中のプログラムではなくシェルによって展開されるため、機能しません。現在のディレクトリにa.pycとb.pycがあり、ディレクトリfooとbar rmがある場合、引数[-r、a.pyc、b.pyc]で呼び出されます。
ephemient 2009

1
コードを他の人にプッシュすることを心配している場合は、.gitignoreに追加するだけ**/*.pycで、再び心配する必要はありません
bubakazouba

回答:


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

384
Findには「-delete」アクションが組み込まれているので、次のようにすることができますfind . -name \*.pyc -delete
Christoffer

51
最も重要なのは、これが開発マシンの場合、PYTHONDONTWRITEBYTECODE = Trueを設定でき、これを再度行う必要がなくなることです。参照:この回答
mlissner '30年

5
あなたは引用していません{}。見つけたパスのフラグメントのように呼び出された中間パスを誤って単語分割して削除するとどうなりますか?
Robottinosino 2013

20
-deleteはPOSIX仕様の一部ではなく、のすべての実装での存在も保証されていませんfind
chepner 2013

7
怖い場合-良いかもしれません--exec echo {}で最初のパスを作成するか、または非常に怖い場合-毎回尋ねるrm -i {}を使用するか、rm-v {}を使用して削除します。
jeanM 2014年

1021

find . -name '*.pyc' -delete

確かに最も簡単です。


21
のバージョンがをfindサポートしている場合-delete、POSIX標準の一部ではありません。
chepner 2013

4
これは.pyoファイルと__pycache__ディレクトリを無視します。私の答えを見てください。
Wilfred Hughes 14

私は受け入れられた回答からのコードを使用し、それは機能しましたが、これらのコマンドはより短くて単純です
Dap

3
-name '*.py?'含める.pyo, .pyc,...
cdosborn 2016

2
MAKE SURE -deleteはコマンドの最後です。検索の直後に誤って-deleteを付けました。それはすべてを削除しました!
thinkanotherone 2017

85

debianの現在のバージョンでpycleanは、python-minimalパッケージにあるスクリプトがあります。

使い方は簡単です:

pyclean .

34
pycleanは、対応する.pyファイルが存在する.pycファイルのみを削除するように見えることは注目に値します(少なくとも私のシステムでは-ubuntu 12.10)。これは、ソースファイルが削除されていて、残りの.pycファイルをクリーンアップします。
tigerFinch 2013

@holms pyclean(および現在py3clean)はDebianパッケージに由来しているため、RHELにはありません。
duozmo 2016年

83

に追加~/.bashrc

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

これにより、すべての.pycファイルと.pyoファイル、および__pycache__ディレクトリが削除されます。また、非常に高速です。

使い方は簡単です:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -deleteフォルダーが削除される前にコンテンツがキューに追加されるため、パスが見つからないことを警告することがよくあります。2>/dev/null修正する必要があります。
マッド物理学者

53

bash> = 4.0(またはzsh)を使用している場合

rm **/*.pyc

は、ディレクトリツリー全体を再帰的にスキャンしながら、直接の第1レベルのサブディレクトリにある*/*.pycすべての.pycファイルを選択することに注意してください**/*.pyc。例として、でfoo/bar/qux.pycrm **/*.pycなくによって削除され*/*.pycます。

globstarシェルオプションを有効にする必要があります。有効にするにはglobstar

shopt -s globstar

そしてそのステータスをチェックするには:

shopt globstar

1
ランニングの違い何rm **/*.pycVsはrm */*.pyc?(後者は私にとってローカルで機能するようでした。)
テイラーエドミストン

1
@TaylorEdmiston rm */*.pyc.pyc、深さ1のすべてのサブディレクトリにあるrm **/*.pycすべての.pycファイルを削除します。深さ0+のすべてのサブディレクトリにあるすべてのファイルを削除します
Adam Stewart

@AdamStewartこれを追加してくれてありがとう。このスレッドにつまずく他人のために、私が経験していた問題はOS Xに同梱され、Appleのbashは(そうglobstarが含まれていないということであった**として動作する*代わりに実行したときと実行がshopt globstarエラーをスローします)。
テイラーエドミストン2017年

30

以前はエイリアスを使用していました:

$ which pycclean

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

12
現在のdebianではpycleanです。
jb。

7
これはファイル名の空白をうまく処理しません。代わりにを使用find -print0してくださいxargs -0
r3m0t 2013年

2
なぜファイル/フォルダー名にスペースを含むpythonコードが必要なのですか?それは構文的に合法ですか?
coredumperror 2015

@CoreDumpErrorはい、実際、WindowsではPythonはスペースのあるディレクトリ(「プログラムファイル」)にインストールされます。
Paul Draper

pythonインタープリターはデフォルトでそこにインストールされますが、コードを配置するのに適した場所ではありません。さらに、Program Filesフォルダーをパッケージ構造の一部にしたくないのは当然です。そのため、私は構文に注意しました。
coredumperror 2018年

24

Windowsユーザーの場合:

del /S *.pyc

これをバッチスクリプトに入れると、処理が非常に簡単になります。ありがとう。
Nick Gotch

また、Powershellを使用している場合は、 "cmd"->コマンドの実行-> "exit"で使用できます。
np8

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

検索は* .pycファイルを再帰的に探します。xargsはその名前のリストを受け取り、それをrmに送信します。-print0と-0は、ファイル名をnull文字で区切るように2つのコマンドに指示します。これにより、スペースを含むファイル名や、改行を含むファイル名でも正しく機能します。

-execを使用したソリューションは機能しますが、すべてのファイルに対してrmの新しいコピーを起動します。遅いシステムや非常に多くのファイルがある場合、時間がかかりすぎます。

いくつかの引数を追加することもできます:

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

inameは* .PYCのように大文字と小文字を区別しません。no-run-if-emptyを使用すると、そのようなファイルがない場合にrmからエラーが発生しなくなります。


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

これは

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

11

さらに、人々は通常、すべて削除する*.pyc*.pyoファイルと__pycache__カレントディレクトリにディレクトリを再帰的に。

コマンド:

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

これは良い答えですが、プレーンなPythonソリューションはクロスプラットフォームであり、それゆえ好ましいでしょう。個人的には、私はWindowsを気にしませんが、おそらくPython人口の半分がWindowsに住んでいます-そしてfindgrepそして友人たちはそこで働いていません。
Peterino

ツールをインストールする場合は、それらを行います。相互互換性を緩和するために、すべてのWindows CLIユーザーにそうすることをお勧めします
。superuser.com/ questions / 168202 /…

8

別のバリアントをミックスに投入するために、次のようにバッククォートを使用することもできます:

rm `find . -name *.pyc`

5
引数が多すぎてに渡すことができないため、一致が多すぎると失敗するというわずかな欠点がありますrm
chepner


7

完全に再帰的

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

興味深いことに、これはアンディやビルの回答とどのように比較されますか?
オースティンヘンリー

3
1つのセット**は冗長であり、d0kの回答のように、これが意図したとおりに機能するには、bash 4+でglobstarを有効にする必要があります。つまりshopt -s globstar、ソースbashの1つでそれを実行または実行します。ファイル。
モニカを復活させてください

1
また、のllようなエイリアスが一般的ですがls -l、実際にはコマンドやポータブルではありません。したがって、のすべての.pycファイルを再帰的に一覧表示するには.、代わりecho **/*.pycにglobstarを有効にして何かを行う必要があります
ください

3

ファーストラン:

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

それから加えて:

export PYTHONDONTWRITEBYTECODE=1

〜/ .profileへ


3

.pycが不要になった場合は、ターミナルで次の1行を使用できます。

export PYTHONDONTWRITEBYTECODE=1

もし気が変わったら:

unset PYTHONDONTWRITEBYTECODE

2

rm -rディレクトリに再帰しますが、指定したディレクトリのみですrm。これらのディレクトリも削除されます。1つの解決策は次のとおりです。

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

find現在のディレクトリですべての* .pycファイルを再帰的に検索し、forループは見つかったファイルのリストを繰り返し処理して、各ファイルを削除します。


これは機能しますが、.shファイルに入れて実行する必要があります(私には問題ありません。このコマンドを複数回使用します)
Teifion

すべてを「;」で区切って1行に置くと、シェルで実行できるはずです。しかし、これをbashで入力すると、bashは最後に「完了」して何かが実行されるのを待ちます...
Chris Lutz

それはひどいアンチパターンです(そして非常に一般的なものですが、消えてしまうといいのですが)。スペースやグロブ文字を含むファイル名で壊れます。そして、それはfindその-exec述語でのポイントを逃します:(find . -name '*.pyc' -exec rm {} +より良く、より短く、より安全で、堅牢で、より効率的)。
gniourf_gniourf 2015年


1

実行できますfind . -name "*.pyc" -type f -delete

ただし、注意して使用してください。最初find . -name "*.pyc" -type fに実行して、削除するファイルを正確に確認します。

また、-deleteがコマンドの最後の引数であることを確認してください。-name * .pyc引数の前に置くと、すべてが削除されます。


1

プロジェクトフォルダからすべての.pycファイルを削除する場合。

まず、あなたは

cd <path/to/the/folder>

次に、すべての.pycファイルを見つけて削除します。

find . -name \*.pyc -delete
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.