Warum klappt das
file --extension
nicht bei mir?
Nicht nur für dich. Siehe diese Frage . Einer der Kommentare scheint richtig zu sein:
Vielleicht nur ein sehr, sehr unvollständiges Feature?
Ich habe kein Standard-Unix-Tool für die Konvertierung gefunden. Daher ist Ihre Idee möglicherweise die einfachste Lösung.
Eine Idee wäre
file --mime-type
, ein Dispatch-Tabellen-Array zu verwenden und dann zu erstellen, das bekannte Mime-Typen auf ihre Erweiterungen abbildet, aber ich hätte lieber eine einfachere und sicherere Lösung.
Beachten Sie, dass eine solche Karte existiert /etc/mime.types
. Sehen Sie sich eine weitere Frage zu Unix & Linux SE an . Basierend auf einer der Antworten kam ich zu folgender Funktion:
function getext() { [ "$#" != 1 ] && { echo "Wrong number of arguments. Provide exactly one." >&2; return 254; } [ -r "$1" ] || { echo "Not a file, nonexistent or unreadable." >&2; return 1; } grep "^$(file -b --mime-type "$1")"$'\t' /etc/mime.types | awk -F '\t+' '' }
Verwendungszweck:
getext test_text_file.txt # it takes just one argument
Passen Sie es an Ihre Bedürfnisse an, machen Sie es zu einem Skript usw. Das Hauptanliegen ist:
- Bei Erfolg (Beendigungsstatus
0
) ist die Ausgabe möglicherweise nicht leer oder leer (nicht gerade\n
). - Einige MIME-Typen geben mehrere Erweiterungen zurück. Sie können
cut -d ' ' -f 1
höchstens eine davon erhalten, es ist jedoch möglicherweise nicht die, die Sie möchten. Daher kann eine benutzerdefinierte Kartendatei anstelle von
/etc/mime.types
nützlich sein. Dieser Befehl zeigt Ihnen, welche Mime-Typen im aktuellen Verzeichnis (und den Unterverzeichnissen) vorhanden sind:find . -type f -exec file -b --mime-type {} + | sort | uniq
grep
sollte nicht mehr als einmal passen (zumindest mit/etc/mime.types
);^
(Zeilenanfang) und$'\t'
(Tab) dienen dazu, partielle Übereinstimmung zu vermeiden. Verwenden Siegrep -m 1 ...
(oderhead -n 1
später), um sicherzustellen, dass Sie höchstens eine Zeile erhalten.