Tengo un conjunto de archivos, todos ellos nombrados según la convención file_[number]_[abcd].bin
(donde [número] es un número en el rango 0-tamaño de la unidad en MB). es decir file_0_a.bin
, hay file_0_b.bin
, file_0_c.bin
y file_0_d.bin
luego se 0
convertiría en a 1
y así sucesivamente.
La cantidad de archivos se calcula en tiempo de ejecución según el tamaño de la partición. Necesito eliminar todos los archivos que se han creado, pero de forma pseudoaleatoria.en bloques de tamaño que necesito poder especificar, es decir, donde hay 1024 archivos, elimine 512 y luego elimine otros 512.
Tengo la siguiente función para hacerlo actualmente, a la que llamo la cantidad requerida de veces, pero cada vez será menos probable que encuentre un archivo que exista, hasta el punto de que es posible que nunca se complete. Obviamente, esto es algo menos que ideal.
¿Cuál es otro método que puedo utilizar para eliminar todos los archivos en orden aleatorio?
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: estoy intentando eliminar en orden aleatorio para poder fragmentar los archivos tanto como sea posible. Esto es parte de un script que comienza llenando una unidad con archivos de 1 MB y los elimina, 1024 a la vez, luego llena el 'espacio' con 1 archivo de 1 GB. Enjuague y repita hasta que tenga algunos archivos de 1 GB muy fragmentados.
Respuesta1
Si quieres eliminartodolos archivos, entonces, en un sistema GNU, podrías hacer:
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
Si desea eliminar solo un cierto número de aquellos que coinciden con una expresión regular, insertaría algo como esto entre sort
y xargs
:
awk -v RS='\0' -v ORS='\0' -v n=1024 '/regexp/ {print; if (--n == 0) exit}'
Con zsh
, podrías hacer:
shuffle() REPLY=$RANDOM
rm -f file_<->_[a-d].bin(.+shuffle[1,1024])
Respuesta2
Aquí hay una posible alternativa usando find
y shuf
:
$ find $destdir -type f | shuf | xargs rm -f
Esto encontrará todos los archivos $destdir
y luego usará el shuf
comando para mezclar su orden y luego pasará la lista para xargs rm -f
su eliminación.
Para controlar cuántos archivos se eliminan:
$ find $destdir -type f | shuf | head -X | xargs rm -f
¿Dónde -X
está la cantidad de archivos que desea eliminar, por ejemplo, head -100
.