Wie kann ich alle in einem Verzeichnis enthaltenen Dateitypen anzeigen?

12

Gibt es einen Befehl, der mir in dem spezifischen Verzeichnis sagt, welche Dateitypen existieren?

Ich kann den Dateityp mit einem Befehl wie herausfinden od -c myfile | less.

Aber ich weiß nicht, wie ich es für alle Dateien in einem Verzeichnis machen soll.

Mohammad Reza Rezwani
quelle

Antworten:

19

Obwohl od -cder Inhalt einer Datei tatsächlich angezeigt wird, ist dies kein guter Weg, um den Dateityp zu ermitteln. Einige Dateien enthalten zwar eine Kopfzeile mit dem Dateityp, jedoch nicht alle. Ein besserer Weg ist der Befehl file:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

So können Sie eine Liste aller Dateitypen in einem Verzeichnis abrufen:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

Beispielausgabe:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

Erläuterung

  • for file in dir/*; do ... done;: Durchlaufen Sie alles in dir( dirist nur ein Beispiel, Sie sollten dies in den Namen des tatsächlichen Verzeichnisses ändern, das Sie durchsuchen möchten), und speichern Sie jedes Element der Reihe nach als$file
  • file "$file": fileauf jedem gefundenen Gegenstand ausführen .
  • cut -d: -f 2: Nur das zweite Feld drucken (Felder definiert durch :)
  • sed 's/^ //; s/ +/ /g' : Entfernen Sie Leerzeichen vom Zeilenanfang und konvertieren Sie aufeinanderfolgende Leerzeichen in ein einzelnes Leerzeichen.
  • sort -u : Entfernen Sie doppelte Dateitypen
terdon
quelle
danke, aber ich kopiere und füge genau "für die Datei in dir / *; mache die Datei" $ file "| cut -d: -f 2 | sort -u; done" in meinem Terminal und ich
bekomme
2
@alex Bitte geben Sie immer den genauen Fehler an, den Sie erhalten, und sagen Sie, dass "ERROR" nicht sehr nützlich ist. In jedem Fall liegt der Fehler wahrscheinlich daran dir/, dass Sie kein Verzeichnis benannt haben , das nur ein Beispielname war. Sie müssen dies in den Namen eines realen Verzeichnisses ändern, zum for file in /home/alex/*; do ... doneBeispiel.
Terdon
danke, wenn du meine falsche arbeit gemacht hast (... ich dachte dir ist befehl wie ls nicht verzeichnis -sorry- auch ich denke besser deine antwort zu editieren) du siehst nur "FEHLER" und sonst nichts.
Mohammad Reza Rezwani
gute Arbeit, danke, aber ich habe zum Beispiel vier Zeilen "Audiodatei mit ID3 Version 2.3.0, enthält" oder mehr als eine "ISO Media, MPEG v4 System, Version 2" gesehen. Ich bin mir nicht sicher, ob Duplikate entfernt werden sollen.
Mohammad Reza Rezwani
@alex fair genug, antworte bearbeitet. Du solltest keine Duplikate bekommen. Die sort -uwerden sie entfernen, die Zeilen müssen unterschiedlich sein (sie können auch eine andere Anzahl von Leerzeichen haben, wodurch sie nicht identisch sind).
Terdon
3

Ich würde wahrscheinlich so etwas tun -

find . -type f -exec file {}  \;

Dadurch wird vom aktuellen Pfad aus nach Dateien (z. B. keine Verzeichnisse) gesucht und anschließend der fileBefehl für jede Datei ausgeführt.

Elliott Frisch
quelle
1

Versuche dies:

ls | xargs file -b | sort | uniq

Wie es funktioniert:

ls : Verzeichnisinhalte auflisten

Datei -b : Bestimmt den Dateityp. Stellen Sie den Ausgabezeilen keine Dateinamen voran

sort : Zeilen sortieren

uniq : wiederholte Zeilen weglassen

Wolfy
quelle
1
Sie können file -b *anstelle von verwenden ls | xargs file -b, um das Parsen zu vermeiden ls.
wjandrea