Was ist der schnellste / einfachste Weg, um eine große Anzahl von Dateien in einem Verzeichnis (unter Linux) zu zählen?

9

Ich hatte ein Verzeichnis mit einer großen Anzahl von Dateien. Jedes Mal, wenn ich versuchte, auf die Liste der darin enthaltenen Dateien zuzugreifen, war ich nicht in der Lage, dies zu tun, oder es gab erhebliche Verzögerungen. Ich habe versucht, ls -Befehl innerhalb der Kommandozeile auf Linux zu verwenden und die Web-Schnittstelle von meinem Hosting-Provider hat auch nicht geholfen.

Das Problem ist, dass wenn ich nur ls mache, es viel Zeit braucht, um überhaupt etwas anzuzeigen. Also, ls | wc -l würde auch nicht helfen.

Nach einigen Recherchen habe ich diesen Code entwickelt (in diesem Beispiel zählt er die Anzahl der neuen E-Mails auf einem Server):

%Vor%

Der obige Code ist in Python geschrieben. Ich habe Pythons Kommandozeilen-Tool verwendet und es hat ziemlich schnell funktioniert (das Ergebnis wurde sofort zurückgegeben).

Ich bin an der Antwort auf die folgende Frage interessiert: Ist es möglich, Dateien in einem Verzeichnis (ohne Unterverzeichnisse) schneller zu zählen? Was ist der schnellste Weg, das zu tun?

    
Tadeck 21.05.2011, 16:31
quelle

7 Antworten

6

ls ruft einen stat(2) Aufruf für jede Datei auf. Andere Tools, wie find(1) und die Shell-Wildcard-Erweiterung, können diesen Aufruf umgehen und tun einfach readdir . Eine Shell-Befehlskombination, die funktionieren könnte, ist find dir -maxdepth 1|wc -l , aber sie listet das Verzeichnis selbst gerne auf und mißt jeden Dateinamen mit einer neuen Zeile darin.

In Python ist der direkte Weg, um nur diese Namen zu erhalten, os.listdir (Verzeichnis) . Im Gegensatz zu os.walk und os.path.walk muss es nicht rekursiv sein, Dateitypen überprüfen oder weitere Python-Funktionsaufrufe ausführen.

Nachtrag: Es scheint, dass ls nicht immer Stat. Zumindest auf meinem GNU-System kann es nur einen getdents-Aufruf ausführen, wenn weitere Informationen (z. B. welche Namen Verzeichnisse sind) nicht angefordert werden. getdents ist der zugrunde liegende Systemaufruf, der zur Implementierung von readdir in GNU / Linux verwendet wird.

Zusatz 2: Ein Grund für eine Verzögerung, bevor ls Ergebnisse ausgibt, ist das Sortieren und Tabellieren. ls -U1 kann dies vermeiden.

    
Yann Vernier 21.05.2011, 16:51
quelle
3

Gesamtanzahl der Dateien im angegebenen Verzeichnis

%Vor%

Gesamtanzahl der Dateien im angegebenen Verzeichnis und allen Unterverzeichnissen darunter

%Vor%

Für weitere Details in ein Terminal fallen und man find

tun     
Lobo 21.05.2011 16:57
quelle
3

Das sollte in Python ziemlich schnell sein:

%Vor%     
martineau 21.05.2011 18:12
quelle
1

Ich denke, ls verbringt die meiste Zeit damit, die erste Zeile anzuzeigen, da die Einträge sortiert werden müssen. Daher sollte ls -U die erste Zeile viel schneller anzeigen (obwohl es möglicherweise nicht viel besser ist). .

    
Dan Berindei 21.05.2011 17:01
quelle
1

Der schnellste Weg wäre, den Overhead der interpretierten Sprachen zu vermeiden und Code zu schreiben, der Ihr Problem direkt anspricht. Dies ist auf portable Weise schwierig, aber ziemlich einfach. Im Moment bin ich auf einer OS X-Box, aber die Konvertierung der folgenden zu Linux sollte äußerst einfach sein. (Ich habe mich dafür entschieden, versteckte Dateien zu ignorieren und nur reguläre Dateien zu zählen ... wenn nötig ändern oder Befehlszeilenschalter hinzufügen, um die gewünschte Funktionalität zu erhalten.)

%Vor%     
William Pursell 22.05.2011 01:03
quelle
0

Ich bin mir nicht sicher über Geschwindigkeit, aber wenn Sie nur Shell-Buildins verwenden möchten, sollte dies funktionieren:

%Vor%     
Shea Levy 21.05.2011 16:39
quelle
0

Mein Anwendungsfall ist ein Linux SBC (Banana Pi), der Dateien in einem Verzeichnis auf einem FAT32 USB-Stick zählt. In einer Shell tun Sie

%Vor%

benötigt 6.4sec mit 32k Dateien (32k = max files / dir auf FAT32) Von Python zu tun

%Vor%

dauert nur 0.874 Sekunden (!) Kann nichts anderes in Python schneller als das sehen.

    
Richard Aplin 02.03.2017 00:42
quelle

Tags und Links