一連のファイルがあり、それらはすべて規則に従って名前が付けられていますfile_[number]_[abcd].bin
([number] は 0 からドライブのサイズ (MB) までの範囲の数字です)。つまりfile_0_a.bin
、、、があり、その後、がfile_0_b.bin
になり、というようになります。file_0_c.bin
file_0_d.bin
0
1
ファイルの数は、パーティションのサイズに基づいて実行時に計算されます。作成されたすべてのファイルを疑似ランダムな方法で削除する必要があります。指定できるサイズのブロックでつまり、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
これにより、 内のすべてのファイルが検索され$destdir
、shuf
コマンドを使用して順序がシャッフルされ、リストが に渡されてxargs rm -f
削除されます。
削除されるファイルの数を制御するには:
$ find $destdir -type f | shuf | head -X | xargs rm -f
-X
は削除するファイルの数です (例: ) head -100
。