GNU/Linux >> Linux の 問題 >  >> Linux

アプリケーション ディレクトリからすべての .svn ディレクトリを削除する方法

パイプ、xargs、exec などは必要ありません:

find . -name .svn -delete

編集: 冗談です、明らかに -delete unlinkat() を呼び出します ボンネットの下にあるため、 unlink のように動作します または rmdir ファイルを含むディレクトリでの操作を拒否します。


あなたが書いたものは、改行で区切られたファイル名 (およびパス) のリストを rm に送信します 、しかし rm はその入力をどうするかわかりません。コマンド ライン パラメーターのみが必要です。

xargs 通常は改行で区切られた入力を受け取り、それらをコマンドラインに配置するため、 xargs を追加すると、以前のものが機能します:

find . -name .svn | xargs rm -fr

xargs rm にできるだけ多くの引数を渡すほど十分にインテリジェントです 受け入れることができるからです。したがって、100 万個のファイルがある場合、rm を実行する可能性があります。 1,000,000/65,000 回 (シェルがコマンド ラインで 65,002 個の引数を受け入れることができる場合 {65k ファイル + rm の場合は 1 + -fr の場合は 1})。

人々が巧みに指摘したように、以下も機能します:

find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

最初の 2 つの -exec フォームは両方とも rm を呼び出します 削除されるフォルダーごとに、つまり、1,000,000 個のフォルダーがある場合、rm 1,000,000回呼び出されます。これは確かに理想的とは言えません。 rm の新しい実装 + でコマンドを終了できるようにします rm であることを示します 可能な限り多くの引数を受け入れます:

find . -name .svn -exec rm -rf {} +

find/xargs の最後のバージョンでは print0 を使用しているため、find は \0 を使用する出力を生成します。 改行ではなくターミネータとして。 POSIX システムでは \0 以外の任意の文字が許可されるため これは、引数が正しく rm に渡されることを確認する最も安全な方法です。 または実行中のアプリケーション。

さらに、-execdir があります。 rm を実行します ベースディレクトリではなく、ファイルが見つかったディレクトリから -depth 深さを最初に開始します。


これを試してください:

find . -name .svn -exec rm -rf '{}' \;

そのようなコマンドを実行する前に、これを最初に実行することがよくあります:

find . -name .svn -exec ls '{}' \;

Linux
  1. Linuxですべてのディレクトリのファイルを再帰的に検索する方法

  2. Ubuntu から aria2 をアンインストールする方法

  3. すべてのファイルとディレクトリを再帰的に一覧表示する方法

  1. ある場所にあるすべてのディレクトリを幅優先で再帰的に一覧表示するにはどうすればよいですか?

  2. Linuxでディレクトリをループする方法は?

  3. Subversionでディレクトリ/ファイルを無視するには?

  1. Linuxでディレクトリを再帰的に検索および削除する方法

  2. すべての Docker コンテナーを削除する方法

  3. 特定のユーザーが書き込み可能なすべてのファイルとディレクトリを見つけるにはどうすればよいですか?