So listen Sie Beispieldateien aus einem Verzeichnis auf

So listen Sie Beispieldateien aus einem Verzeichnis auf

Ich habe ein Verzeichnis, das Hunderttausende von Dateien enthält.
Ich muss eine Auswahl dieser Dateien auflisten (Beispiel 10 Dateien), ohne alle im Verzeichnis gefundenen Dateien zu verarbeiten, da dies zu viel Verarbeitungszeit in Anspruch nehmen würde.

Antwort1

Ich glaube nicht, dass Sie aus der gesamten Dateiliste eine Stichprobe nehmen können, ohne sie alle auf die eine oder andere Weise zu lesen, nicht einmal auf Dateisystemebene.

Es sei dennIhre Namen folgen einem Muster (z. B. DateiXXXXXXX). In diesem Fall könnten Sie vor dem Zugriff auf die Dateien eine zufällige Liste mit Namen generieren. Bei einer so großen Anzahl von Dateien wäre es seltsam, wenn ihre Namen zufällig wären.

Aber nehmen wir an, Sie haben nicht so viel Glück. Die Verwendung von findist besser als die von ls, da es die Ausgabe mit null maskieren kann und somit immun gegen nicht standardmäßige Zeichen in Dateinamen ist. Wenn wir nicht alle Dateien lesen möchten, ist es am schnellsten, die am Anfang der Liste stehenden Dateien zu verwenden. Um eine bessere Stichprobe zu erhalten, würde ich zuerst eine größere Stichprobe verwenden ( $oversamplesizesiehe unten) und dann von dort aus eine zufällige Teilauswahl der Größe treffen $samplesize. Ich habe es nicht geschafft, Null-Trennzeichen zu erstellen sort -Roder shufgut damit zu arbeiten, daher erfolgt das Mischen und die endgültige Auswahl durch awk:

 find ~ -type f -print0 | 
 grep --null --null-data -m ${oversamplesize:-100} . | 
 awk -v samplesize=${oversamplesize:-11} -vRS='\0' -vORS='\0' \
   '{ a[NR]=$0 } END {srand(); while (i<samplesize) { b=(int(rand()*10000)%samplesize); if (b in c) {continue;} else {c[b]=a[b]; print a[b]; i++;} }; }' | 
 xargs -0 echo # echo here being just a dummy

Zwei Anmerkungen hier. Aus irgendeinem Grund wird oft auch ein leerer Dateiname gedruckt, also habe ich vorsichtshalber die Stichprobengröße erhöht. Die triviale Anmerkung ist, nicht zu vergessen, den Suchpfad (~ hier) und den letzten Befehl zu ändern.

verwandte Informationen