¿Cómo elimino todo un conjunto de archivos en orden aleatorio?

¿Cómo elimino todo un conjunto de archivos en orden aleatorio?

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.biny file_0_d.binluego se 0convertiría en a 1y 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 sorty 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 findy shuf:

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

Esto encontrará todos los archivos $destdiry luego usará el shufcomando para mezclar su orden y luego pasará la lista para xargs rm -fsu eliminación.

Para controlar cuántos archivos se eliminan:

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

¿Dónde -Xestá la cantidad de archivos que desea eliminar, por ejemplo, head -100.

información relacionada