規則に従って名前付きファイルセットがありますfile_[number]_[abcd].bin
。ここで、[数字]は0からドライブサイズ(MB単位)までの数字です。つまり、、、、file_0_a.bin
afile_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つの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
?