Как удалить все файлы из набора в случайном порядке?

Как удалить все файлы из набора в случайном порядке?

У меня есть набор файлов, все они названы в соответствии с соглашением 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.

Связанный контент