Wie lösche ich alle Dateien eines Satzes in zufälliger Reihenfolge?

Wie lösche ich alle Dateien eines Satzes in zufälliger Reihenfolge?

Ich habe eine Reihe von Dateien, die alle nach der Konvention benannt sind file_[number]_[abcd].bin(wobei [Zahl] eine Zahl im Bereich 0 – Laufwerksgröße in MB ist). Es gibt also file_0_a.bin, file_0_b.bin, file_0_c.binund file_0_d.bin, und dann würde aus dem ein usw. 0werden .1

Die Anzahl der Dateien wird zur Laufzeit anhand der Größe der Partition ermittelt. Ich muss alle erstellten Dateien löschen, aber auf pseudozufällige Weise.in Blöcken der Größe, die ich angeben müssen, d. h. wo 1024 Dateien sind, löschen Sie 512 und dann weitere 512.

Ich habe derzeit die folgende Funktion, um dies zu tun, die ich die erforderliche Anzahl von Malen aufrufe, aber es wird zunehmend unwahrscheinlicher, dass eine vorhandene Datei gefunden wird, bis zu dem Punkt, an dem sie möglicherweise nie abgeschlossen wird. Dies ist offensichtlich nicht gerade ideal.

Welche andere Methode kann ich verwenden, um alle Dateien in zufälliger Reihenfolge zu löschen?

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

Bearbeiten: Ich versuche, in zufälliger Reihenfolge zu löschen, damit ich die Dateien so weit wie möglich fragmentieren kann. Dies ist Teil eines Skripts, das zunächst ein Laufwerk mit 1 MB großen Dateien füllt und diese löscht, jeweils 1024 auf einmal, und dann die „Lücke“ mit einer 1 GB großen Datei füllt. Wiederholen Sie diesen Vorgang, bis Sie einige sehr fragmentierte 1 GB große Dateien haben.

Antwort1

Wenn Sie löschen möchtenalledie Dateien, dann könnten Sie auf einem GNU-System Folgendes tun:

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

Wenn Sie nur eine bestimmte Anzahl der mit einem regulären Ausdruck übereinstimmenden Einträge löschen möchten, fügen Sie zwischen „ sortund “ etwas wie das Folgende ein xargs:

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

Mit zshkönnen Sie Folgendes tun:

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

Antwort2

Hier ist eine mögliche Alternative mit findund shuf:

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

Dadurch werden alle Dateien gefunden $destdirund der shufBefehl wird verwendet, um ihre Reihenfolge zu ändern. Anschließend wird die Liste xargs rm -fzum Löschen an übergeben.

So begrenzen Sie, wie viele Dateien gelöscht werden:

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

Dabei -Xsteht die Anzahl der Dateien, die Sie löschen möchten, beispielsweise head -100.

verwandte Informationen