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

引数リストが長すぎると報告されたときに、ディレクトリからすべてのファイルを削除するにはどうすればよいですか

解決策 1:

find . -maxdepth 1 -type f -exec rm -f {} \;

単純に時間がかかりすぎます (ファイルごとに rm の 1 つの実行)。

これははるかに効率的です:

find . -maxdepth 1 -type f -print0 | xargs -r0 rm -f

可能な限り多くのファイル名を rm の引数として取り、次のファイル名のロードで rm を実行するため... rm が 2 回または 3 回しか呼び出されないことがあります。

解決策 2:

ディレクトリを削除できない場合は、いつでも find を使用できます。

find . -maxdepth 1 -type f -exec rm -f {} \;

これにより、現在のディレクトリ内のすべてのファイルが削除され、現在のディレクトリのみが削除されます (サブディレクトリは削除されません)。

解決策 3:

これらは両方とも問題を回避します。ここに、各テクニックのそれぞれのパフォーマンスの分析があります。

find . -name WHATEVER -exec rm -rf {} \;

または

ls WHATEVER | xargs rm -rf

この問題は、ディレクトリ内のすべての項目で「*」を展開する bash に起因します。これらのソリューションはどちらも、代わりに各ファイルを順番に処理します。

解決策 4:

1 つのレベルをバックアップすることで、これを行うことができました:

cd ..

実行中:

rm directory name -rf

そして、ディレクトリを再作成します。

解決策 5:

これらの find 呼び出しはすべて非常に優れていますが、急いでいるときに必要な命名法を正確に覚えていることはほとんどありません。代わりに ls を使用しています。誰かが言及しているように、 ls .動作しますが、次のように ls -1 を好みます:

ls -1 | xargs -n 100 rm -rf

-n xxx の数値は、最大値を超えると自動修正されるため ( size-max を超えた場合。 -s を参照)、アプリの args-max を超えた場合は通常はかなり安全です。

大きなディレクトリ内のファイルのサブセットのみを削除し、何らかの理由で検索を使用したくない場合は、このチェーンの途中に grep を挿入すると便利です。

この回答は、ls、xargs などに Gnu コア ユーティリティを使用していることを前提としています。


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

  2. rm、cp、mv コマンドの引数リストが長すぎるというエラー

  3. ディレクトリ内の最後に変更された 5 つのファイルを一覧表示 (ls) するにはどうすればよいですか?

  1. bash:/bin/tar:tar で多数のファイルを圧縮すると、引数リストが長すぎます

  2. すべてのファイルを現在のディレクトリから上位ディレクトリに移動する方法は?

  3. 2 つのディレクトリにまたがるすべての一意のファイルを検索/一覧表示する方法は?

  1. ファイルシステム上のすべてのハードリンクされたファイルを見つけるにはどうすればよいですか?

  2. 一部を除くディレクトリ内のすべてのファイルを削除する方法は?

  3. ホームディレクトリの空のディレクトリを再帰的に削除するにはどうすればよいですか?