ディレクトリ内の1000個を除くすべてのランダムファイルを削除する


13

データ生成スクリプトの実行時間が長すぎると、200,000個以上のファイルができるようになります。これを1000程度に減らす必要があります。Linuxコマンドラインから、これらのファイルを1000個を除いてすべて削除する簡単な方法があります。ファイル名やその他の属性に依存しませんか?


ファイルを作成したプロセスには、各ファイルを以前のファイルに関連付ける特性がありましたか?もしそうなら、ランダムに選択するよりも代表的なサンプルを取得することが重要でしょう。プロセスが生成された場合は本質的にランダムであるファイルには、最初に1000の後だけ削除すべてできた
fixer1234

回答:


15

ディレクトリ内の1000個を除くすべてのランダムファイルを削除する

コード:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm

説明:

  1. 内のすべてのファイル一覧/path/to/dirとしfind
    • print0:行区切り文字として\0null文字)を使用し ます。したがって、スペース/改行を含むファイルパスはスクリプトを壊しません
  2. でファイルリストをシャッフルしますsort
    • -z:(改行)の\0代わりに(null文字)を区切り文字として使用する\n
    • -R: 順不同
  3. ランダム化されたリストから最初の1000行をtail;
    • -z:リストをゼロ区切りとして扱います(と同じsort
    • -n +1001:1001から始まる行を表示(つまり、最初の1000行を省略)
  4. xargs -0 rm -残りのファイルを削除します。
    • -0:ゼロ区切り、再び

quixoticのソリューションよりも優れている理由*:

  1. スペース/改行を含むファイル名で動作します。
  2. ディレクトリを作成しようとしません(すでに存在している可能性があります)。
  3. ファイルを移動せず、で一覧表示する以外に1000の「ラッキーファイル」にさえ触れませんfind
  4. 何らかの理由での出力が(改行)でfind終わっていない場合に、ファイルの欠落を回避します\n

*-のquixoticへのクレジットは| sort -R | head -1000、私に出発点を与えました。


CentOS 6で実行すると、無効なオペランドに関するエラーが発生しました。幸い、ファイルパスのスペースは気にしていないので、これらのオペランドを削除するとうまくいきましたfind . -type f | sort -R | tail -n +1001 | xargs rm
Brad

@bradエラーメッセージとバージョンを教えてくださいfind。私は私の答えを改善しようとしますが、作業するためにいくつかの入力が必要です。
rld。

3
tail: invalid option -- 'z'私が持っている尾のバージョンは8.4です
ブラッド

ファイルがない場合のエラーを回避するために--no-run-if-emptyをxargsに追加します(例として2回実行した後)
fraff

1

一時ディレクトリ、次にfindすべてのファイルを使用し、を使用してリストをランダム化し、リストsortの上位1000を一時ディレクトリに移動します。残りを削除してから、一時ディレクトリからファイルを戻します。

$ mkdir ../tmp-dir
$ find . -type f | sort -R | head -1000 | xargs -I "I" mv I ../tmp-dir/
$ rm ./*
$ mv ../tmp-dir/* .

xargs行の長さに不満がある場合は、でより小さい数値を使用し、head必要に応じてコマンドを繰り返します(つまり、に変更-1000-500て2回実行するか、に変更し-200て5回実行します)。

また、スペースを含むファイル名の処理にも失敗します。RLDの回答@ショーは、使用することができますfind-print0引数、-z引数にsortしてhead、そして-0持つxargs適切なファイル名の取扱いを確保します。

最後に、tmp-dirすでに存在する場合は、存在しないディレクトリ名に置き換える必要があります。


リストされたファイル名のいずれかにfindスペースが含まれている場合、これは失敗します。
rld。

0

Macユーザーの場合、次のスクリプトで実行できます。

find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm

trsortとtailがの\n代わりにでリストを処理できるようにします\0


-2

最も簡単なのは、ディレクトリのrm -rfを実行してから、データ生成スクリプトを再実行し、実行時間が長すぎないことを確認することです。


それはOPが要求したものではありません。多分そうすることは現実的ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.