golang - sed regex tester




Datenträgerverwendung von Dateien, deren Namen einem regulären Ausdruck entsprechen, unter Linux? (4)

In vielen Situationen wollte ich wissen, wie viel Speicherplatz von was verwendet wird, damit ich weiß, was ich loswerden, in ein anderes Format konvertieren, woanders speichern (z. B. Daten-DVDs), auf eine andere Partition verschieben, usw. In diesem Fall betrachte ich eine Windows-Partition von einem bootfähigen SliTaz Linux- Medium.

In den meisten Fällen möchte ich die Größe der Dateien und Ordner, und dafür verwende ich NCurses-basiertes ncdu :

In diesem Fall möchte ich jedoch die Größe aller Dateien ermitteln, die einem regulären Ausdruck entsprechen . Ein Beispiel für einen regulären Ausdruck für .bak-Dateien:

.*\.bak$

Wie erhalte ich diese Informationen, wenn ich ein Standard-Linux mit GNU-Kerndienstprogrammen oder BusyBox ?

Bearbeiten: Die Ausgabe soll von einem Skript analysiert werden können.


Die akzeptierte Antwort schlägt vor, zu verwenden

find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1

Auf meinem System funktioniert dies jedoch nicht, --files-0-from Option --files-0-from auf meinem System nicht kennen. Nur GNU du kennt diese Option, sie ist weder Bestandteil des POSIX-Standards (also nicht in FreeBSD oder macOS) noch auf BusyBox-basierten Linux-Systemen (z. B. den meisten eingebetteten Linux-Systemen) oder einem anderen Linux-System das benutzt nicht die GNU du Version.

Dann gibt es eine Antwort, die vorschlägt:

find path/to/directory -iregex .*\.bak$ -exec du -csh '{}' + | tail -1

Diese Lösung funktioniert, solange nicht zu viele Dateien gefunden wurden. + Bedeutet, dass find versucht, du mit so vielen Treffern wie möglich in einem einzigen Aufruf aufzurufen. Möglicherweise gibt es jedoch eine maximale Anzahl von Argumenten (N) a System unterstützt und wenn es mehr Treffer als diesen Wert gibt, ruft find du mehrmals auf und teilt die Treffer in Gruppen auf, die jeweils kleiner oder gleich N sind. In diesem Fall ist das Ergebnis falsch und zeigt nur die Größe des letzten du Aufrufs an .

Schließlich gibt es eine Antwort mit stat und awk , was eine gute Möglichkeit ist, aber es basiert auf Shell-Globbing in einer Weise, die nur Bash 4.x oder höher unterstützt. Es funktioniert nicht mit älteren Versionen und wenn es mit anderen Shells funktioniert, ist es unvorhersehbar.

Eine POSIX-konforme Lösung (funktioniert unter Linux, MacOS und allen BSD-Varianten), die keinerlei Einschränkungen aufweist und mit jeder Shell funktioniert, wäre:

find . -regex '.*\.bak' -exec stat -f "%z" {} \; | awk '{s += $1} END {print s}'

Die vorherigen Lösungen haben bei mir nicht richtig funktioniert (ich hatte Probleme beim Leiten), aber die folgenden Lösungen haben hervorragend funktioniert:

find path/to/directory -iregex ".*\.bak$" -exec du -csh '{}' + | tail -1

Die iregex Option ist ein regulärer Ausdruck, bei dem die Groß- und Kleinschreibung nicht iregex wird. Verwenden Sie regex wenn zwischen Groß- und Kleinschreibung unterschieden werden soll.

Wenn Sie mit regulären Ausdrücken nicht iname , können Sie die iname oder name (erstere iname die Groß- und Kleinschreibung nicht):

find path/to/directory -iname "*.bak" -exec du -csh '{}' + | tail -1

Wenn Sie die Größe jedes Matches (und nicht nur die Gesamtsumme) wünschen, lassen Sie einfach den Befehl piped tail weg:

find path/to/directory -iname "*.bak" -exec du -csh '{}' +

Diese Ansätze vermeiden das Unterverzeichnisproblem in der Antwort von @MaddHackers.

Hoffe, dies hilft anderen in der gleichen Situation (in meinem Fall, die Größe aller DLLs in einer .NET-Lösung zu finden).


Ich schlage vor, etwas wie: zu find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1 find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1

Einige Notizen:

  • Die -print0 für find und --files0-from für du dienen dazu, Probleme mit Leerzeichen in Dateinamen zu vermeiden
  • Der reguläre Ausdruck wird mit dem gesamten Pfad ./dir1/subdir2/file.bak , z. B. ./dir1/subdir2/file.bak , nicht nur file.bak . Wenn Sie ihn ändern, berücksichtigen Sie dies
  • Ich habe h flag für du verwendet, um ein "lesbares" Format zu erzeugen, aber wenn Sie die Ausgabe analysieren möchten, sind Sie mit k möglicherweise besser dran (verwenden Sie immer Kilobyte)
  • Wenn Sie den Befehl tail entfernen, werden zusätzlich die Größen bestimmter Dateien und Verzeichnisse angezeigt

Nebenbemerkung: FileLight ist ein nützliches GUI-Tool, mit dem Sie herausfinden können, wer Ihren Speicherplatz FileLight . Es führt keine regulären Ausdrücke aus, ist jedoch sehr praktisch, um große Verzeichnisse oder Dateien zu finden, die Ihre Festplatte verstopfen.


Wenn Sie mit Glob-Mustern einverstanden sind und sich nur für das aktuelle Verzeichnis interessieren:

stat -c "%s" *.bak | awk '{sum += $1} END {print sum}'

oder

sum=0
while read size; do (( sum += size )); done < <(stat -c "%s" *.bak)
echo $sum

Die %s Direktive zu stat gibt Bytes und nicht Kilobytes an.

Wenn Sie in Unterverzeichnisse absteigen möchten, können Sie mit der bash-Version 4 shopt -s globstar und das Muster **/*.bak





diskspace