一連のファイルすべてをランダムな順序で削除するにはどうすればよいでしょうか?

一連のファイルすべてをランダムな順序で削除するにはどうすればよいでしょうか?

一連のファイルがあり、それらはすべて規則に従って名前が付けられていますfile_[number]_[abcd].bin([number] は 0 からドライブのサイズ (MB) までの範囲の数字です)。つまりfile_0_a.bin、、、があり、その後、がfile_0_b.binになり、というようになります。file_0_c.binfile_0_d.bin01

ファイルの数は、パーティションのサイズに基づいて実行時に計算されます。作成されたすべてのファイルを疑似ランダムな方法で削除する必要があります。指定できるサイズのブロックでつまり、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 GB のファイル 1 つで埋めるスクリプトの一部です。断片化された 1 GB のファイルが得られるまで、これを繰り返します。

答え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とを使用した代替案を以下に示しますshuf

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

これにより、 内のすべてのファイルが検索され$destdirshufコマンドを使用して順序がシャッフルされ、リストが に渡されてxargs rm -f削除されます。

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

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

-Xは削除するファイルの数です (例: ) head -100

関連情報