Wie zeige ich den Dateityp mit ls an?

12

Ich lsweiß nicht , ob eine Dateitypspalte angezeigt werden kann.

Eine schnelle Online-Suche und die Suche nach manhaben eine solche Funktion nicht ergeben. Ist es dazu in der Lage?

Erläuterung: Dies ist besonders hilfreich, wenn Dateien keine Erweiterung haben.

Aktualisieren

Ab dem 28.04.2018 waren die Antworten recht interessant, lieferten jedoch nicht das, wonach ich suchte. Genauer,

  • filegibt die tatsächlichen Dateitypen an, lässt sich aber nicht gut integrieren ls. Insbesondere benutze ichls -lhtrpG --group-directories-first --color=always

  • ls -Fist eine lsLösung, bietet jedoch Symbole, keine Spalte der tatsächlichen Dateitypen.

Aus diesem Grund habe ich keine der Antworten als die Antwort markiert, nach der ich suche.

user10853
quelle
Verwandte Informationen: für Menschen lesbar: ls -lahtrpF --group-directories-first --color=always /devoder ls -lsahG /devund für Programme lesbar ls -lsa /dev. man lsEinzelheiten finden Sie in der Dokumentation.
user1742529

Antworten:

15

fileist definitiv die richtige Wahl, um die gewünschten Dateitypinformationen zu erhalten. Um seine Ausgabe mit der von zu kombinieren, lsschlage ich vor, Folgendes zu verwenden find:

find -maxdepth 1 -type f -ls -exec file -b {} \;

Dadurch wird jede Datei im aktuellen Verzeichnis gefunden und die Ausgabe ls -dilssowie die Ausgabe file -bfür jede Datei in einer eigenen Zeile gedruckt . Beispielausgabe:

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

Aber, wie Sie nicht über eine Datei des Typs wollen Linie , sondern eine Datei des Typs Spalte , hier ist eine Art und Weise des Newline - Zeichen zwischen den Zeilen zu befreien:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

Beispielausgabe:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

Diese neue Spalte ist ziemlich lang, also lassen Sie uns alles vom ersten Komma abschneiden:

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

Die Ausgabe davon sieht folgendermaßen aus:

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

Das ist nicht ganz praktisch, also wie wäre es mit einem alias? Mit der folgenden Zeile in Ihrer ~/.bash_aliasesDatei müssen Sie nur ausführen lsf, um die obige Ausgabe für das aktuelle Verzeichnis zu erhalten.

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'
Dessert
quelle
1
Wenn Sie eine Funktion anstelle eines Alias ​​verwenden, ist dies weniger ein Anführungszeichen, und wenn Sie pasteoder verwenden column, können Sie eine bessere Ausrichtung erzielen: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }Das Ausrichtungsproblem ist in der Antwort aufgrund der ähnlichen Größen und Daten nicht ersichtlich. (Dies wird auch etwas schneller sein, da die Befehle weniger statt einmal pro Datei aufgerufen werden.)
Muru
@muru Danke für die vielen guten Vorschläge! Funktioniert dieser columnAnsatz für Sie? Es druckt nur die Ausgabe ls -lfür jede Datei, gefolgt von fileder Ausgabe für jede Datei für mich, als ob die Shell nur tun würde ls -l "$@"; file -b "$@" | cut -d, -f1...
Dessert
Es tut. paste.ubuntu.com/p/KjPthXPDPb - Der obere Teil stammt vom Alias ​​und der untere Teil ist die Funktion, von der beide ausgeführt werden /etc.
Muru
Ich glaube, ich sehe das Problem - wenn columndie Ausgabe nicht an das Terminal erfolgt, müssen Sie die Spaltenanzahl angeben, sonst werden die Dateien nacheinander ausgegeben. so column -c "$COLUMNS" ...sollte in jedem Fall arbeiten.
Muru
Sie starten (mindestens?) 5 Prozesse für jede Datei, daher wird dies wahrscheinlich langsam sein, wenn sich viele Dateien in einem Verzeichnis befinden…
Januar
10

Ich denke, der beste Weg, um einen Dateityp anzuzeigen, ist die Verwendung dieses Befehls:

file <filename>

Wenn Sie die Typen aller Dateien in einem Verzeichnis auflisten möchten, verwenden Sie einfach:

file *

<code> Datei * </ code> Beispiel von meinem Computer

Weitere Einzelheiten zu den Argumenten finden Sie unter:

man file
Singrium
quelle
Diese Antwort antwortet zwar nicht direkt auf die Frage des OP, zeigt jedoch den richtigen Weg, um den MIME-Typ einer Datei zu finden, und sollte als die richtige Antwort markiert werden. Um den mime typeeinzigen, zu verwenden: file --mime-type filename.
Pedro Lobito
@PedroLobito Ich denke, die eng verwandte Frage deckt fileziemlich gut ab, aber diese Frage ist anders.
Nachtisch
Ich stimme dieser Antwort zu, da Sie als Erste eine fileAntwort gegeben haben. Da ich den anderen geantwortet habe, reicht dies nicht aus (es muss in ls integriert werden), also halte ich es bei einer Abstimmung. Vielen Dank.
user10853
1
Datei * ist die beste Antwort
Straßenbahn
1
file --mime /dev/*für
Mimes
7

Zur Verdeutlichung möchte ich darauf hinweisen, dass Sie den Dateityp im Grunde genommen mit lsdem -FFlag (klassifizieren) sehen können, das je nach Typ ein Symbol an den Dateinamen anfügt:

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

Sie können jedoch sehen, dass diese Informationen im ersten Buchstaben der Ausgabe von etwas weniger kryptisch angezeigt werden ls -l. Die Antwort von wjandrea beschreibt dies genauer.

Aber ich denke nicht, dass Sie das mit Dateityp meinen. Der lsBefehl sieht sich keine regulären Dateien an - nur Verzeichnisverzeichnisse (in denen Dateinamen gespeichert sind) und Inodes (in denen Metadaten gespeichert sind, einschließlich des "Typs" in dem zuvor genannten Sinne).

Daher kann der lsBefehl den Dateityp nicht in dem Sinne anzeigen, dass es sich um ein JPG-Bild oder eine Binärdatei oder eine Textdatei oder ein LibreOffice-Dokument handelt, da er diese Informationen nicht enthält.

Dazu als singrium Antwort weist darauf hin, müssen Sie den fileBefehl, die Blicke auf dem ersten 50-100kB oder so von Dateiinhalten ihre Art zu bestimmen.

Zanna
quelle
@ Zana Danke, dass du meine Aufmerksamkeit auf diese Flagge gelenkt hast. Dies würde es vorerst tun, obwohl es nicht das ist, wonach ich gesucht habe (tatsächliche Dateitypen). Dafür werde ich abstimmen.
user10853
3

Eine Form des Dateityps ist, ob eine Datei eine reguläre Datei, ein Verzeichnis, ein Gerät, ein Symlink usw. lsist. Dies kann mithilfe von Optionen -loder angezeigt werden -F.

  • Option -lzeigt den Dateityp als einzelnes Zeichen am Anfang einer Auflistung an, z.

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    Wo -ist eine reguläre Datei, dist ein Verzeichnis und list ein Symlink.

  • Option -Fzeigt den Dateityp als Suffix an, z.

    $ ls -F
    DIR/ FILE LINK@
    

    Wo kein Suffix eine reguläre Datei ist, /ist es ein Verzeichnis und @ein Symlink.

Weitere Informationen hierzu finden Sie in info coreutils 'ls invocation', zusammengefasst hier:

Für -l:

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

Für -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
wjandrea
quelle