Ich habe eine Reihe von Dateien, die alle mit der Konvention benannt sind file_[number]_[abcd].bin
(wobei [Nummer] eine Nummer im Bereich 0-Größe des Laufwerks in MB ist). dh es ist file_0_a.bin
, file_0_b.bin
, file_0_c.bin
und file_0_d.bin
und dann das 0
würde ein 1
und so weiter.
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. Löschen Sie in Blöcken mit einer Größe, die ich angeben muss , dh wo 1024 Dateien vorhanden sind, 512 und dann weitere 512.
Ich habe derzeit die folgende Funktion, die ich die erforderliche Anzahl von Malen aufrufe, aber es wird zunehmend weniger wahrscheinlich, dass eine vorhandene Datei gefunden wird, bis zu dem Punkt, an dem sie möglicherweise nie vollständig ist. Offensichtlich ist dies etwas weniger als ideal.
Was ist eine andere Methode, mit der ich alle Dateien in zufälliger Reihenfolge löschen kann?
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-Dateien füllt und diese jeweils 1024 löscht und dann die Lücke mit 1 1-GB-Datei füllt. Spülen und wiederholen Sie den Vorgang, bis Sie einige sehr fragmentierte 1-GB-Dateien haben.
quelle
*.bin(o+functionName)
Notation wie in unix.stackexchange.com/a/9831 verwendenAntworten:
Wenn Sie alle Dateien löschen möchten , können Sie auf einem GNU-System Folgendes tun:
Wenn Sie nur eine bestimmte Anzahl von Personen löschen möchten, die einem regulären Ausdruck entsprechen, fügen Sie so etwas zwischen
sort
und einxargs
:Mit
zsh
könnten Sie tun:quelle
xargs -r0
Flagge tut?printf '%s\0' *
Formatiert jedes Argument%s\0
so,find
dass es Punktdateien ausschließt, die Liste sortiert und keinen Prozess verzweigt. Und du kannst es tunprintf '%s\0' file_*_[a-d].bin
.find
ist möglicherweise besser, wenn Sie nur reguläre Dateien möchten, obwohl Sie auch zsh und seine Globbing-Qualifikationsmerkmale verwenden können.Hier ist eine mögliche Alternative mit
find
undshuf
:Dadurch werden alle Dateien in gefunden
$destdir
und anschließend mit demshuf
Befehl die Reihenfolge gemischt und die Liste zumxargs rm -f
Löschen an weitergeleitet.So geben Sie an, wie viele Dateien gelöscht werden:
Wo
-X
ist die Anzahl der Dateien , die Sie zum Beispiel löschen, mögen,head -100
.quelle
shuf
auf dem System, aber ich habe nicht angegeben, was ich hatte, so dass dies nicht aufhört, eine gute Antwort zu sein)find
Gibt durch Zeilenumbrüche getrennte Literalzeichenfolgen aus undxargs
liest eine durch Shell-Anführungszeichen und Leerzeichen getrennte Liste von Namen als Eingabe. Ein böswilliger Name in der Eingabe kann dazu führen, dass etwas ganz anderes gelöscht wird, als Sie löschen möchten.