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


回答:


11

ディレクトリを削除できない場合は、常に検索を使用できます。

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

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


ほぼ完璧(私の投稿も参照)
asdmin 09

2
Linuxでは、「\;」の代わりに「+」を使用することで、さらに高速に実行できます。これにより、「rm」あたりのファイル数が一気に増えます。
トーマス

5
さらに高速:(削除するファイルごとにプロセスをfind dir/to/delete -delete生成しませんrm)。
モーテンシーバー2009

モーテン:彼はディレクトリ自体を削除したいとは決して言っていなかった。find dir/to/delete -type f -delete
リチョ

21
見つける。-maxdepth 1 -type f -exec rm -f {} \;

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

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

見つける。-maxdepth 1 -type f -print0 | xargs -r0 rm -f

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


5
誰かがfindの動作を知っているのを見てうれしいです...また、新しいgnu findの-deleteアクションまたは-execコマンド{} +をxargsのように動作させることも検討してください。「man find」の「アクション」セクションを参照してください。
カイルブラント

-exec cmd {} +について知りませんでした。それはかなり便利に見えます。-deleteより少し一般的です:)
David Pashley

-deleteは問題ないかもしれませんが、私は個人的にさまざまなマシンで使用できるコマンドを好みます。-deleteが彼らの仕事ではないだろうようとSolarisシステムで私の仕事は、古い
asdmin

2
コンピューターを他の人が同時に使用する場合は、ionice直前に追加rmすることをお勧めします。
ヒューバートカリオ

6

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

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

または

ls WHATEVER | xargs rm -rf

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


2
すべてのファイルに対してrmコマンドを呼び出すため、多くのファイルでは検索ソリューションが遅くなります。xargsソリューションは高速ですが、ファイル名にスペースが含まれていない場合にのみ機能します(そうでない場合はGNU findおよびが必要ですfind . -print0 | xargs -0 rm)。
ロブキャスト09

「find。-name WHATEVER -print0 | xargs -0 rm -rf」の方が効率的です。findはすべてのファイルに対してrmをフォークしますが、xargsはそれを最小限に減らします。スペースを含むファイルに対処するには、-print0および-0が必要です。おそらく、findで-depthも使用する必要があるため、深さ優先検索を実行します。
デビッドパシュリー

lsコマンドは「引数リストが長すぎます」を返すため、機能しません
ブレント

2
あなたは「ls *」を実行しており、「*」は、シェルが長すぎると不平を言っている引数リストに展開します。ls .代わりに" "を実行します(または、1つ上のディレクトリレベルに移動して " ls [dirname]" を実行します)。
ジェームズ・スニーリンガー09

超える長さにシェルによってsubstitudedされるだろうWHATEVER:質問と同じ理由で仕事が機能しなかったではないでしょう| 2番目のコマンドライン(xargsのRM -rf WHATEVER LS)
asdmin

3

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

cd ..

実行中:

rm directory name -rf

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


1
dirを永続的に保持する必要がない場合にのみ機能し、すべてのファイルとディレクトリは再帰的に削除されます。私の人生のほとんどの場合、この方法ではうまくいきませんでした。
asdmin 2009

2

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

ls -1 | xargs -n 100 rm -rf

-n xxxの数字は、最大値を超えると自動修正される(size-maxを超える場合; -sを参照)か、アプリのargs-maxを超える場合は通常明らか。

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

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


これは、「ls」が機能するには大きすぎるディレクトリで機能しますか?(同じエラー-引数リストが長すぎます)
ブレント

はい、ブレント:lsを呼び出すときにfilespecを使用しないでください。上記のように、-1(ダッシュ1)のみを使用します。また、上記で説明したように、ファイルリストのペアを作成する必要がある場合は、lsの後にgrepを使用します。lsでワイルドカードを使用していないことを確認した後に「長すぎる」エラーが表示される場合、xargsがエラーを出している可能性があります。「xargs -n 100」の代わりに「xargs -n 5」を使用すると、少し遅い場合でも間違いなく安全です。
rixtertech 2009

1

この-exec +オプションを使用して、rmの実行を可能な限り少なくしようとするものを見つけることができます。

find . -type f -exec rm '{}' +

0

これは、システムの応答性を維持する必要がある場合に大量のファイルを削除するためのバージョンです。

これは、小さなバッチ(デフォルトでは100ファイル)で作業を発行し、他のジョブが完了するまで少し待つことで機能します。

ext3の1つのディレクトリから50万以上のファイルを削除するために見事に働きました。少しのボーナスとして行われた割合を印刷します

noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do 
   n=$((n+100));
   sync;
   echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
   sleep 5;
done

0

「長すぎる引数」または「メモリを割り当てられない」エラーを解決します

これは、セッションフォルダー内の220,000以上のファイルに対してトリックを行いました。

利点:ファイルの削除をすぐに開始します

cd path / to / folder
ls -f | xargs rm -f -v

削除するファイルのスクリーンショットをクリックします - (15分以内にすべてのファイルを削除しました)

-f (lsの後)事前ソートを行わない

-v (rmの後)は、各ファイルが削除されたものとして表示します

-f (rmの後)書き込み保護されたファイルでプロンプトなしで強制的に通過します。

ヒント:ファイルを削除しようとしているときに追加の自動生成ファイルが追加されないように、最初にフォルダーの名前を変更します(元のセッションはsession_oldに変更)。私の場合のように自動的に元のディレクトリが作成されない場合は、元のディレクトリを手動で再作成できます


以前の回答から欠落していた回答の新機能は何ですか?
user2233709
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.