У меня есть набор файлов, все они названы в соответствии с соглашением file_[number]_[abcd].bin
(где [число] — это число в диапазоне от 0 до размера диска в МБ). То есть есть 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 МБ и удаляет их по 1024 за раз, а затем заполняет «пробел» одним файлом по 1 ГБ. Промойте и повторите, пока не получите очень фрагментированные файлы по 1 ГБ.
решение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
.