I have a set of files, all that are named with the convention file_[number]_[abcd].bin
(where [number] is a number in the range 0-size of drive in MB). i.e there is file_0_a.bin
, file_0_b.bin
, file_0_c.bin
and file_0_d.bin
and then the 0
would become a 1
and so on.
The number of files is figured out at run-time based on the size of the partition. I need to delete all of the files that have been created, but in a pseudo-random manner. in blocks of size that I need to be able to specify, i.e where there is 1024 files, delete 512, then delete another 512.
I have the following function for doing it currently, which I call the required number of times, but it will get progressively less likely to find a file that exists, to the point where it might never complete. Obviously, this is somewhat less than ideal.
What is another method that I can use to delete all of the files in a random order?
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;
}
Edit:
I'm trying to delete in random order so that I can fragment the files as much as possible. This is part of a script that begins by filling a drive with 1MB files, and deletes them, 1024 at a time, then fills the 'gap' with 1 1GB file. Rinse and repeat until you have some very fragmented 1GB files.
Best Answer
If you want to delete all the files, then, on a GNU system, you could do:
If you want to only delete a certain number of those matching a regexp you'd insert something like this between the
sort
andxargs
:With
zsh
, you could do: