すべてのファイルセットをランダムな順序で削除する方法は?

すべてのファイルセットをランダムな順序で削除する方法は?

規則に従って名前付きファイルセットがありますfile_[number]_[abcd].bin。ここで、[数字]は0からドライブサイズ(MB単位)までの数字です。つまり、、、、file_0_a.binafile_0_b.binなどfile_0_c.binfile_0_d.binなります。01

ファイル数は、パーティションのサイズに基づいて実行時に計算されます。生成されたすべてのファイルを削除する必要がありますが、疑似ランダムな方法で削除する必要があります。指定できる大きさの塊でつまり、1024個のファイルがある場合は、512個を削除し、512個をさらに削除します。

現在、これを行うには、次の関数があります。必要に応じて何度も呼び出すが存在し、完了しない可能性があるファイルを見つける可能性が減少します。明らかに、これは理想的ではありません。

すべてのファイルをランダムに削除するにはどのような方法がありますか?

deleteRandFile() #$1 - total number of files
{
    i=$((RANDOM%$1))
    j=$((RANDOM%3))
    file=""

    case $j in
    0)
        file="${dest_dir}/file_${i}_a.bin";;
    1)
        file="${dest_dir}/file_${i}_b.bin";;    
    2)
        file="${dest_dir}/file_${i}_c.bin";;
    3)
        file="${dest_dir}/file_${i}_d.bin";;
    esac

    if ! [[ -f $file ]]; then
        deleteRandFile $1
    else
        rm $file
    fi

    return 0;
}

編集:ファイルをできるだけ分割できるようにランダムな順序で削除しようとしています。これは、最初にドライブを1 MBのファイルでいっぱいにし、一度に1024個ずつ削除してから、1つの1 GBのファイルで「間隔」を埋めるスクリプトの一部です。非常に断片化された1GBのファイルが出るまですすぎ、繰り返します。

答え1

削除したい場合みんなファイルがある場合は、GNUシステムで次のことができます。

cd -P -- "$destdir" &&
  printf '%s\0' * | # print the list of files as zero terminated records
    sort -Rz |      # random sort (shuffle) the zero terminated records
    xargs -r0 rm -f # pass the input if non-empty (-r) understood as 0-terminated
                    # records (-0) as arguments to rm -f

正規表現に一致する特定の数の項目のみを削除するには、次のsort内容を間に挿入できますxargs

awk -v RS='\0' -v ORS='\0' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'

これにより、zsh次のことができます。

shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])

答え2

find以下は、andの使用に対する潜在的な選択肢ですshuf

$ find $destdir -type f | shuf | xargs rm -f

その後、その中のすべてのファイルを見つけてコマンドを使用して混在させ、$destdir削除するshufリストを渡します。xargs rm -f

削除されたファイルの数を制御するには:

$ find $destdir -type f | shuf | head -X | xargs rm -f

-X削除したいファイルの数はどこにありますかhead -100

関連情報