Como excluo todos os arquivos de um conjunto em ordem aleatória?

Como excluo todos os arquivos de um conjunto em ordem aleatória?

Eu tenho um conjunto de arquivos, todos nomeados de acordo com a convenção file_[number]_[abcd].bin(onde [número] é um número no intervalo 0 do tamanho da unidade em MB). ou seja file_0_a.bin, existe file_0_b.bin, file_0_c.bine file_0_d.binentão o 0se tornaria um 1e assim por diante.

O número de arquivos é calculado em tempo de execução com base no tamanho da partição. Preciso excluir todos os arquivos que foram criados, mas de forma pseudo-aleatória.em blocos de tamanho que preciso especificar, ou seja, onde houver 1.024 arquivos, exclua 512 e exclua outros 512.

Atualmente, tenho a seguinte função para fazer isso, que chamo o número necessário de vezes, mas será cada vez menos provável que encontre um arquivo que exista, a ponto de nunca ser concluído. Obviamente, isso está um pouco abaixo do ideal.

Qual é outro método que posso usar para excluir todos os arquivos em ordem aleatória?

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;
}

Editar: estou tentando excluir em ordem aleatória para poder fragmentar os arquivos o máximo possível. Isso faz parte de um script que começa preenchendo uma unidade com arquivos de 1 MB e os exclui, 1.024 por vez, e depois preenche a 'lacuna' com 1 arquivo de 1 GB. Enxágue e repita até obter alguns arquivos de 1 GB muito fragmentados.

Responder1

Se você quiser excluirtodosos arquivos, então, em um sistema GNU, você poderia fazer:

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

Se você quiser excluir apenas um certo número daqueles que correspondem a uma expressão regular, insira algo assim entre sorte xargs:

awk -v RS='\0' -v ORS='\0' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'

Com zshvocê poderia fazer:

shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])

Responder2

Aqui está uma alternativa potencial usando findand shuf:

$ find $destdir -type f | shuf | xargs rm -f

Isso encontrará todos os arquivos $destdire, em seguida, usará o shufcomando para embaralhar sua ordem e, em seguida, passará a lista xargs rm -fpara exclusão.

Para determinar quantos arquivos são excluídos:

$ find $destdir -type f | shuf | head -X | xargs rm -f

Onde -Xestá o número de arquivos que você deseja excluir, por exemplo, head -100.

informação relacionada