Como faço para excluir todos os conjuntos de arquivos em uma ordem aleatória?

7

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

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

Eu tenho a seguinte função para fazê-lo atualmente, que eu chamo o número necessário de vezes, mas vai ficar cada vez menos provável encontrar um arquivo que existe, a ponto de ele nunca poder ser concluído. Obviamente, isso é um pouco menos que ideal.

Qual é outro método que posso usar para excluir todos os arquivos em uma 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: Eu estou tentando excluir em ordem aleatória para que eu possa fragmentar os arquivos, tanto quanto possível. Isso faz parte de um script que começa preenchendo uma unidade com arquivos de 1 MB e os exclui, 1024 de uma vez, e preenche a lacuna com 1 arquivo de 1 GB. Enxague e repita até ter alguns arquivos de 1 GB muito fragmentados.

    
por Yann 08.10.2014 / 12:35

2 respostas

13

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

cd -P -- "$destdir" &&
  printf '%s
awk -v RS='
shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])
' -v ORS='
cd -P -- "$destdir" &&
  printf '%s
awk -v RS='
shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])
' -v ORS='%pre%' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'
' * | # 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
' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'
' * | # 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 um regexp, insira algo assim entre o sort e o xargs :

%pre%

Com zsh , você poderia fazer:

%pre%     
por 08.10.2014 / 12:40
11

Veja uma alternativa em potencial usando find e shuf :

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

Isso localizará todos os arquivos em $destdir e, em seguida, usará o comando shuf para ordenar a ordem e, em seguida, passará a lista para xargs rm -f para exclusão.

Para bloquear quantos arquivos são excluídos:

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

Em que -X é o número de arquivos que você deseja excluir, por exemplo, head -100 .

    
por 08.10.2014 / 14:12