かなり大きなプロジェクトの一部のファイルの名前を変更し、それらが残した.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 **/*.pyc
Vsは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]で呼び出されます。