2008-09-02 18 views
32

Gibt es eine maximale Anzahl von Inodes in einem einzelnen Verzeichnis?Maximale Anzahl von Inodes in einem Verzeichnis?

Ich habe ein Verzeichnis von über 2 Millionen Dateien und kann nicht ls Befehl gegen dieses Verzeichnis arbeiten. Jetzt frage ich mich, ob ich ein Limit für Inodes in Linux überschritten habe. Gibt es eine Grenze vor einer numerischen Grenze von 2^64?

+0

Sie meinen eine maximale Anzahl von Einträge in einem einzigen Verzeichnis, richtig?Schließlich könnten Sie 2 Millionen Hardlinks zu derselben Datei in einem Verzeichnis erstellen, und das würde das gleiche Problem verursachen. –

Antwort

0

Können Sie die Anzahl der Dateien wirklich zählen? Fällt es sehr nahe an eine Grenze von 2^n? Kann es sein, dass Ihnen der RAM nicht mehr ausreicht, um alle Dateinamen zu speichern?

Ich weiß, dass in Windows zumindest die Leistung des Dateisystems dramatisch fallen würde, da die Anzahl der Dateien im Ordner stieg, aber ich dachte, dass Linux nicht von diesem Problem betroffen war, zumindest wenn Sie eine Eingabeaufforderung verwendeten . Gott helfe dir, wenn du versuchst, etwas wie Nautilus zu bekommen, um einen Ordner mit so vielen Dateien zu öffnen.

Ich frage mich auch, woher diese Dateien stammen. Können Sie Dateinamen programmgesteuert berechnen? Wenn dies der Fall ist, können Sie möglicherweise ein kleines Programm schreiben, um sie in eine Reihe von Unterordnern zu sortieren. Wenn Sie den Namen einer bestimmten Datei angeben, erhalten Sie Zugriff, wenn Sie versuchen, den Namen zu suchen. Zum Beispiel habe ich einen Ordner in Windows mit etwa 85.000 Dateien, wo dies funktioniert.

Wenn diese Technik erfolgreich ist, könnten Sie versuchen, einen Weg zu finden, diese Art der Speicherung dauerhaft zu machen, selbst wenn Sie dieses kleine Programm nur als Cron-Job ausführen. Es wird besonders gut funktionieren, wenn Sie die Dateien nach Datum sortieren können.

10

Nein. Inode-Limits sind per Dateisystem und wurden zum Zeitpunkt der Dateisystemerstellung festgelegt. Du könntest ein anderes Limit erreichen, oder 'ls' funktioniert einfach nicht so gut.

Try this:

tune2fs -l /dev/DEVICE | grep -i inode 

Es sollte Sie alle Arten von Inode in Verbindung stehendes Info erzählen.

0

Sofern Sie keine Fehlermeldung erhalten, arbeitet ls aber sehr langsam. Sie können versuchen, nur die ersten zehn Dateien wie folgt aussehen:

ls -f | head -10

Wenn Sie sich die Dateiinformationen für eine Weile schauen müssen gehst, können Sie sie in einer Datei zuerst setzen. Wahrscheinlich möchten Sie die Ausgabe an ein anderes Verzeichnis als das Verzeichnis senden, das Sie gerade auflisten!

ls > ~/lots-of-files.txt

Wenn Sie etwas zu den Dateien tun möchten, können Sie xargs verwenden. Wenn Sie sich dazu entschließen, ein Skript zu schreiben, um die Arbeit zu erledigen, vergewissern Sie sich, dass Ihr Skript die Liste der Dateien als Stream und nicht auf einmal verarbeitet. Hier ist ein Beispiel für das Verschieben aller Dateien.

ls | xargs -I thefilename mv thefilename ~/some/other/directory

Sie könnten kombinieren, dass mit dem Kopf eine kleinere Anzahl der Dateien zu verschieben.

ls | head -10000 | xargs -I x mv x /first/ten/thousand/files/go/here

Sie wahrscheinlich ls | head in einen Shell-Skript, dass werden aufgespalten, die Dateien in einen Haufen von Verzeichnissen mit einer überschaubaren Anzahl von Dateien in jedem kombinieren.

+1

ls | head -10 funktioniert nicht, um ein sofortiges Ergebnis zu erhalten, weil ls sortiert - also muss es alles lesen, bevor es etwas drucken kann. –

+0

In diesem Fall versuchen Sie: ls -f | head -10 –

48

df -i sollte Ihnen die Anzahl der verwendeten Inodes und kostenlos im Dateisystem mitteilen.

17

Versuchen Sie ls -U oder ls -f.

ls, sortiert die Dateien standardmäßig alphabetisch. Wenn Sie 2 Millionen Dateien haben, kann diese Art sehr lange dauern. Wenn ls -U (oder vielleicht ls -f), dann werden die Dateinamen sofort gedruckt.

3

Die maximale Verzeichnisgröße hängt vom Dateisystem ab, und daher variiert das genaue Limit. Sehr große Verzeichnisse sind jedoch eine schlechte Übung.

Sie sollten Ihre Verzeichnisse verkleinern, indem Sie Dateien in Unterverzeichnisse sortieren. Ein gemeinsames Schema ist die ersten beiden Zeichen für ein First-Level-Unterverzeichnis zu verwenden, wie folgt:

 
${topdir}/aa/aardvark 
${topdir}/ai/airplane 

Dies funktioniert besonders gut bei Verwendung von UUID, GUIDs oder Content-Hash-Werten für die Namensgebung.

1

Wie von Rob Adams festgestellt, sortiert ls die Dateien vor der Anzeige. Beachten Sie, dass der NFS-Server das Verzeichnis vor dem Senden sortiert, wenn Sie NFS verwenden, und 2 Millionen Einträge möglicherweise länger dauern als das NFS-Zeitlimit. Das macht das Verzeichnis über NFS auch mit dem Flag -f unlesbar.

Dies kann auch für andere Netzwerkdateisysteme gelten.

Obwohl die Anzahl der Einträge in einem Verzeichnis nicht beschränkt ist, sollten Sie die Anzahl der Einträge, die Sie erwarten, begrenzen.

0

Für NetBackup führen die Binärdateien, die die Verzeichnisse in Clients analysieren, eine Art von Auflistung aus, die durch die enorme Menge an Dateien in jedem Ordner (etwa eine Million pro Ordner, SAP-Arbeitsverzeichnis) Timeouts.

Meine Lösung war (wie Charles Duffy in diesem Thread schreiben), die Ordner in Unterordnern mit weniger Archiven neu zu organisieren.

-1

Eine weitere Option ist find:

find . -name * -exec somcommands {} \;

{} die absolute Filepath ist.

Der Vorteil/Nachteil ist, dass die Dateien nacheinander bearbeitet werden.

find . -name * > ls.txt

würden alle Dateinamen drucken in ls.txt

find . -name * -exec ls -l {} \; > ls.txt

würde in alle Informationen Form ls für jede Datei drucken ls.txt

+0

Sie müssen den Wildchar in einfache Anführungszeichen einschließen, wenn Sie nicht möchten, dass er von der Shell expandiert wird (er kann ziemlich lang sein, wenn es +2 Millionen Dateien gibt!) –

+1

Sie sollten etwas über die 'xargs' lernen Befehl. Es ist viel effizienter als die Option -exec des Befehls find. –

+2

@Didier Trosset, neue Versionen der POSIX-Standardunterstützung 'find ... -exec {} +' (anstatt '-exec {};'), die eine ähnliche Effizienz wie Xargs hat. –