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:
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
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.
dir/
, dass Sie kein Verzeichnis benannt haben , das nur ein Beispielname war. Sie müssen dies in den Namen eines realen Verzeichnisses ändern, zumfor file in /home/alex/*; do ... done
Beispiel.sort -u
werden sie entfernen, die Zeilen müssen unterschiedlich sein (sie können auch eine andere Anzahl von Leerzeichen haben, wodurch sie nicht identisch sind).Ich würde wahrscheinlich so etwas tun -
Dadurch wird vom aktuellen Pfad aus nach Dateien (z. B. keine Verzeichnisse) gesucht und anschließend der
file
Befehl für jede Datei ausgeführt.quelle
Versuche dies:
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
quelle
ls
file -b *
anstelle von verwendenls | xargs file -b
, um das Parsen zu vermeidenls
.