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.bin
e file_0_d.bin
então o 0
se tornaria um 1
e 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 sort
e xargs
:
awk -v RS='\0' -v ORS='\0' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'
Com zsh
você poderia fazer:
shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])
Responder2
Aqui está uma alternativa potencial usando find
and shuf
:
$ find $destdir -type f | shuf | xargs rm -f
Isso encontrará todos os arquivos $destdir
e, em seguida, usará o shuf
comando para embaralhar sua ordem e, em seguida, passará a lista xargs rm -f
para exclusão.
Para determinar quantos arquivos são excluídos:
$ find $destdir -type f | shuf | head -X | xargs rm -f
Onde -X
está o número de arquivos que você deseja excluir, por exemplo, head -100
.