コンパイルしたデータをすべて削除する必要があります。
build
というディレクトリobj
というディレクトリコマンドを書いた
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
すべてのディレクトリを再帰的に処理し、必要なものをすべて削除します。
最後にそのような出力があるのはなぜですか?多分私は別のコマンドを書く必要があります。
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
とにかく削除するディレクトリで-Prune
を使用して、find
にファイルを見つけようとしないように指示します。
find . \( -name build -o -name obj -o -name '*.so' \) -Prune -exec rm -rf {} +
また、*.so
は、シェルによって現在のディレクトリの.so
ファイルのリストに展開される場合があるため、引用符で囲む必要があることに注意してください。
GNU -regex
- typeと同等のものは次のようになります。
find . \( -name build -o -name obj -o -name '*?.so' \) -Prune -exec rm -rf {} +
GNU特定の構文を使用する場合は、-delete
の代わりに-exec rm -rf {} +
を使用することもできます。-delete
、GNU find
は自動的に-depth
をオンにします。外部コマンドを実行しないので、より効率的です。また、誰かが競合状態を解消するため、より安全です。 find
がファイルを見つけてrm
が削除するまでの間にディレクトリをシンボリックリンクに変更することで、間違ったファイルを削除できる場合があります(詳細はinfo -f find -n 'Security Considerations for find'
を参照) 。
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+\.so)' -delete
その理由は、find
が最初にディレクトリツリーを削除し、ディレクトリの内容を確認しようとするためです。これは、明らかに最良の順序ではありません。最初にfind
に強制的に内容を確認させることができます:
find . -depth ...
ファイルには-delete
、ディレクトリには-exec rmdir
の使用を検討する必要があります。
私の解決策。
find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -Prune -exec rm -rf {} +