web-dev-qa-db-ja.com

名前でファイルとディレクトリを削除します。そのようなファイル、又はディレクトリはありません

コンパイルしたデータをすべて削除する必要があります。

  • buildというディレクトリ
  • objというディレクトリ
  • * .soファイル。

コマンドを書いた

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
36
Maksim Dmitriev

とにかく削除するディレクトリで-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
62

その理由は、findが最初にディレクトリツリーを削除し、ディレクトリの内容を確認しようとするためです。これは、明らかに最良の順序ではありません。最初にfindに強制的に内容を確認させることができます:

find . -depth ...

ファイルには-delete、ディレクトリには-exec rmdirの使用を検討する必要があります。

8
Hauke Laging

私の解決策。

find . -regextype posix-egrep -regex ".*/(obj|build|.+\.so)" -Prune -exec rm -rf {} +

+ vs \; -execコマンド内

0
Maksim Dmitriev