かなり大きなプロジェクトの一部のファイルの名前を変更し、それらが残した.pycファイルを削除したいと考えています。私はbashスクリプトを試しました:
rm -r *.pyc
しかし、私が思っていたように、それはフォルダーを再帰しません。何が悪いのですか?
**/*.pycで、再び心配する必要はありません
かなり大きなプロジェクトの一部のファイルの名前を変更し、それらが残した.pycファイルを削除したいと考えています。私はbashスクリプトを試しました:
rm -r *.pyc
しかし、私が思っていたように、それはフォルダーを再帰しません。何が悪いのですか?
**/*.pycで、再び心配する必要はありません
回答:
find . -name "*.pyc" -exec rm -f {} \;
find . -name \*.pyc -delete
{}。見つけたパスのフラグメントのように呼び出された中間パスを誤って単語分割して削除するとどうなりますか?
-deleteはPOSIX仕様の一部ではなく、のすべての実装での存在も保証されていませんfind。
find . -name '*.pyc' -delete
確かに最も簡単です。
findサポートしている場合-delete、POSIX標準の一部ではありません。
__pycache__ディレクトリを無視します。私の答えを見てください。
-name '*.py?'含める.pyo, .pyc,...
debianの現在のバージョンでpycleanは、python-minimalパッケージにあるスクリプトがあります。
使い方は簡単です:
pyclean .
pyclean(および現在py3clean)はDebianパッケージに由来しているため、RHELにはありません。
に追加~/.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修正する必要があります。
bash> = 4.0(またはzsh)を使用している場合
rm **/*.pyc
は、ディレクトリツリー全体を再帰的にスキャンしながら、直接の第1レベルのサブディレクトリにある*/*.pycすべての.pycファイルを選択することに注意してください**/*.pyc。例として、でfoo/bar/qux.pycはrm **/*.pycなくによって削除され*/*.pycます。
globstarシェルオプションを有効にする必要があります。有効にするにはglobstar:
shopt -s globstar
そしてそのステータスをチェックするには:
shopt globstar
rm **/*.pycVsはrm */*.pyc?(後者は私にとってローカルで機能するようでした。)
rm */*.pycは.pyc、深さ1のすべてのサブディレクトリにあるrm **/*.pycすべての.pycファイルを削除します。深さ0+のすべてのサブディレクトリにあるすべてのファイルを削除します
**として動作する*代わりに実行したときと実行がshopt globstarエラーをスローします)。
以前はエイリアスを使用していました:
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
find -print0してくださいxargs -0。
Windowsユーザーの場合:
del /S *.pyc
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からエラーが発生しなくなります。
さらに、人々は通常、すべて削除する*.pyc、*.pyoファイルと__pycache__カレントディレクトリにディレクトリを再帰的に。
コマンド:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
find、grepそして友人たちはそこで働いていません。
完全に再帰的
ll **/**/*.pyc
rm **/**/*.pyc
**は冗長であり、d0kの回答のように、これが意図したとおりに機能するには、bash 4+でglobstarを有効にする必要があります。つまりshopt -s globstar、ソースbashの1つでそれを実行または実行します。ファイル。
llようなエイリアスが一般的ですがls -l、実際にはコマンドやポータブルではありません。したがって、のすべての.pycファイルを再帰的に一覧表示するには.、代わりecho **/*.pycにglobstarを有効にして何かを行う必要があります
rm -rディレクトリに再帰しますが、指定したディレクトリのみですrm。これらのディレクトリも削除されます。1つの解決策は次のとおりです。
for i in $( find . -name *.pyc )
do
rm $i
done
find現在のディレクトリですべての* .pycファイルを再帰的に検索し、forループは見つかったファイルのリストを繰り返し処理して、各ファイルを削除します。
findその-exec述語でのポイントを逃します:(find . -name '*.pyc' -exec rm {} +より良く、より短く、より安全で、堅牢で、より効率的)。
rmがある場合、引数[-r、a.pyc、b.pyc]で呼び出されます。