ディレクトリからファイルのサンプルを一覧表示する方法

ディレクトリからファイルのサンプルを一覧表示する方法

数十万のファイルを含むディレクトリがあります。
ディレクトリ内にあるすべてのファイルを処理せずに、これらのファイルのサンプル (例: 10 ファイル) をリストする必要があります。そうすると処理時間が長くなりすぎます。

答え1

ファイルシステム レベルであっても、何らかの方法でファイル リスト全体を読み取らずに、ファイル リスト全体からサンプルを採取することはできないと思います。

ない限りファイルの名前は (例: fileXXXXXXX) というパターンに従っており、その場合、ファイルにアクセスする前にランダムな名前のリストを事前に生成することができます。このような大量のファイルの場合、名前がランダムであるとは奇妙です。

しかし、そんなに幸運ではないと仮定しましょう。findよりも を使用する方が好まれます。これlsは、出力を null でエスケープできるため、ファイル名の非標準文字の影響を受けなくなるためです。すべてのファイルを読み取りたくない場合は、リストの先頭にあるファイルを使用するのが最も高速です。より良いサンプルを取得するには、最初に大きなサンプル ($oversamplesize以下) を使用し、そこからサイズのランダムなサブセレクションを実行します。null セパレーターを作成したり、うまく操作したり$samplesizeできなかったため、シャッフルと最終的な選択は によって行われます。sort -Rshufawk

 find ~ -type f -print0 | 
 grep --null --null-data -m ${oversamplesize:-100} . | 
 awk -v samplesize=${oversamplesize:-11} -vRS='\0' -vORS='\0' \
   '{ a[NR]=$0 } END {srand(); while (i<samplesize) { b=(int(rand()*10000)%samplesize); if (b in c) {continue;} else {c[b]=a[b]; print a[b]; i++;} }; }' | 
 xargs -0 echo # echo here being just a dummy

ここで注意すべき点が 2 つあります。何らかの理由で、空のファイル名が出力されることもよくあるため、念のためサンプル サイズを増やしました。些細な注意点は、検索パス (ここでは ~) と最後のコマンドを変更することを忘れないことです。

関連情報