Angenommen, es gibt ein Verzeichnis mit 300 Datendateien. Ich möchte 200 dieser Dateien zufällig auswählen und in ein anderes Verzeichnis verschieben. Gibt es eine Möglichkeit, dies unter Unix / Linux zu tun?
linux
shell
command-line
filesystems
directory
Bit-Frage
quelle
quelle
list.files()
...shuf
undhead
(oder einfach benutzenshuf -n
, hätte die Manpage lesen sollen ...)Antworten:
Wenn Ihr System dies hat
shuf
, können Sie dies ganz bequem verwenden (sogar mit hässlichen Dateinamen umgehen):Wenn Sie keine haben,
shuf
aber eine habensort
, die braucht-R
, sollte dies funktionieren:quelle
shuf
wird es nicht aufgerufen,tros
weil es das Gegenteil von Sortieren bewirkt.)quelle
Fügen Sie alle Dateinamen in ein Array mit dem Namen "files" in bash ein:
Größe des Arrays:
Definieren Sie 2/3 davon als Stichprobengröße:
Dies wählt Duplikate aus und wird
nichtmit Dateinamen mit Leerzeichen und dergleichen getestet.Die einfachste Möglichkeit, Duplikate zu vermeiden, besteht darin, alle Dateien zu durchlaufen und jede mit einer Wahrscheinlichkeit von 2/3 auszuwählen. Dies führt jedoch nicht unbedingt zu 200 Dateien.
Dadurch wird eine Datei entfernt, wenn sie aus der Liste ausgewählt wurde und Ihren Anforderungen entspricht:
quelle
$RANDOM
Kann nur Werte von 0 bis 32767 haben, daher funktioniert dies nicht richtig, wenn Sie mehr als 32768 Dateien haben. Das Abrufen ist auch auf die ersten Dateien ausgerichtet.Wenn dies statistisch zufällig sein muss, sollten Sie nicht verwenden
RANDOM % ${#keys[@]}
. Erwägen:$RANDOM
hat 32768 eindeutige WerteBei der Auswahl des ersten Elements besteht daher für jedes der 68 ersten Elemente eine Chance von 110/32768 ~ = 0,33569% und für jedes der anderen 232 Elemente eine Chance von 109/32768 ~ = 0,33264%. Die Kommissionierung wird mehrmals mit unterschiedlichen Chancen wiederholt, jedoch immer in Richtung der ersten Elemente verschoben
32768 % ${#keys[@]} -ne 0
, sodass sich der Fehler addiert.Dies sollte unvoreingenommen sein und funktioniert mit jedem Dateinamen:
quelle
Kevins Lösung funktioniert großartig! Etwas anderes, das ich oft benutzt habe, weil es mir leichter fällt, mich über den Kopf zu erinnern, ist etwas wie:
quelle
Ein Liner in der Bash:
quelle