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


32

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

  • 呼ばれるディレクトリ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

あなたはどのシステムにいますか?あなたは、常に使用する必要がありfind、このようにfind /search_directory options検索ディレクトリは良いアイデアではありませんomiting
Kiwy

このような自動削除は悪い考えです。スクリプトを使用して候補を提示することもできます。候補を確認してから、システムにとって重要なものや必要なものを削除しないようにしてください。これを実行している場所は明確ではありません。ユーザー空間でのみこれを行っている場合は、それほど害を及ぼすことはないと思いますが、システム領域で誤ってこれを行っていないことを確認する必要があります。このようなスクリプトをユーザーとして実行することは間違いありません。
ファヒムミタ14

@ Kiwy、@ FaheemMitha、このコマンドはプロジェクトディレクティティでのみ使用されます。そこには何の害もありません。
マクシムドミトリエフ

回答:


54

-pruneとにかく削除findしようとしているディレクトリで使用して、その中のファイルを見つけようとすることを邪魔しないように指示します。

find . \( -name build -o -name obj -o -name '*.so' \) -prune -exec rm -rf {} +

また*.so、シェルによって.so現在のディレクトリのファイルのリストに展開される可能性があるため、引用符で囲む必要があることに注意してください。

GNU -regexタイプと同等のものは次のようになります。

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

-deleteまた、より良いスペースのようなものを扱う
Izkata

@Izkata、-exec rm -rf {} +どちらにも問題がないよりはましです。
ステファンシャゼラス14

@StephaneChazelas-混乱している{}-引用するべきかどうか 引用符なしで動作するようですが、例ではGNU Findutils Manualが使用'{}'しています。明確にしていただけますか?
グレブネケ

1
@grebneke、非常に古いバージョンので引用符が必要になる可能性のある投稿がどこかにあると思いますが、その主張をcsh確認することはできませんでした。私が知っている現代のシェルでは必要ありません。POSIXには絶対に必要ありません。POSIXの例は、それらを使用しないでください。
ステファンシャゼル14年

3
また-delete、ディレクトリでは使用できません。
St0rM

8

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

find . -depth ...

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


0

私の解決策。

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

+ vs \; -execコマンドで


削除されたディレクトリ内で実行の境界が発生しない場合にのみ、常に機能するとは限りません。
ジル 'SO-悪であるのをやめる'

@Gilles、「実行間の境界」とはどういう意味ですか?
マクシムドミトリエフ14

1
-exec … {} +コマンド行に収まる限り、一度に複数のファイルに対してコマンドを実行します。ファイルが多すぎる場合(または、パスの全長が長すぎる場合、より正確には)は、のfind複数のインスタンスを実行します。rmしたがって、トラバースしているディレクトリが削除される可能性があります。の+場合よりもの可能性は低くなります;+、問題は解決しません。
ジル「SO-悪であるのをやめる」14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.