Comment afficher le type de fichier avec ls?


12

Je ne sais pas s'il lsest capable d'afficher une colonne de type de fichier.

Faire une recherche rapide en ligne et rechercher le mann'a pas révélé une telle capacité. Est-il capable de faire ça?

Clarification: Ceci est particulièrement utile si les fichiers n'ont pas d'extension.

Mettre à jour

Au 28-04-2018, les réponses étaient assez intéressantes, mais elles ne fournissaient pas ce que je cherchais. Plus précisement,

  • filedonne les types de fichiers réels mais ne s'intègre pas bien avec ls. Plus précisément, j'utilisels -lhtrpG --group-directories-first --color=always

  • ls -Fest une lssolution mais elle fournit des symboles et non une colonne de types de fichiers réels.

Pour cette raison, je n'ai marqué aucune des réponses comme réponse que je recherche.



informations connexes: pour lisible par l'homme: ls -lahtrpF --group-directories-first --color=always /devou ls -lsahG /dev, et pour le programme lisible ls -lsa /dev. voir la man lsdocumentation pour plus de détails.
user1742529

Réponses:


16

fileest certainement le bon choix pour obtenir les informations de type de fichier que vous souhaitez. Pour combiner sa sortie avec celle de lsje propose d'utiliser find:

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

Cela trouve chaque fichier dans le répertoire courant et imprime la sortie de ls -dilsainsi que la sortie de file -bpour lui, chacun sur une ligne propre. Exemple de sortie:

  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

Mais, comme vous ne voulez pas de ligne de type de fichier mais plutôt une colonne de type de fichier , voici un moyen de se débarrasser du caractère de nouvelle ligne entre les lignes:

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

Exemple de sortie:

-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

Cette nouvelle colonne est assez longue, nous allons donc tout couper de la première virgule:

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

La sortie de cela ressemble à ceci:

-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

Ce n'est pas très pratique, alors pourquoi pas un alias? Avec la ligne suivante dans votre ~/.bash_aliasesfichier, il vous suffit d'exécuter lsfpour obtenir la sortie ci-dessus pour le répertoire en cours.

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

1
Si vous utilisez une fonction au lieu d'un alias, ce sera moins un enfer de guillemets, et si vous utilisez pasteou column, vous pourriez obtenir un meilleur alignement: lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }le problème d'alignement n'est pas évident dans la réponse en raison des tailles et des dates similaires. (Cela sera également légèrement plus rapide, car les commandes seront invoquées moins de fois au lieu d'une fois par fichier.)
muru

@muru Merci pour les nombreuses bonnes suggestions! Cette columnapproche vous convient-elle? Il imprime simplement la sortie de ls -lpour chaque fichier suivi de filela sortie de 'pour chaque fichier pour moi, comme si la coquille ferait juste ls -l "$@"; file -b "$@" | cut -d, -f1
dessert

Cela fait. paste.ubuntu.com/p/KjPthXPDPb - la partie supérieure provient de l'alias et la partie inférieure est la fonction, toutes deux exécutées depuis /etc.
muru

Je pense que je vois le problème - si columnla sortie n'est pas vers le terminal, vous devez spécifier le nombre de colonnes ou il sortira les fichiers les uns après les autres; column -c "$COLUMNS" ...devrait donc fonctionner dans les deux cas.
muru

Vous lancez (au moins?) 5 processus pour chaque fichier, donc cela va probablement être lent quand il y a beaucoup de fichiers dans un répertoire…
JanC

10

Je pense que la meilleure façon d'afficher un type de fichier est d'utiliser cette commande:

file <filename>

Si vous souhaitez répertorier les types de tous les fichiers d'un répertoire, utilisez simplement:

file *

Échantillon <code> fichier * </code> de mon ordinateur

Pour plus de détails sur les arguments, voir:

man file

Bien que cette réponse ne réponde pas directement à la question de l'OP, elle montre la bonne façon de trouver le type MIME d'un fichier et doit être marquée comme la bonne réponse. Pour obtenir la mime typeseule, utilisez: file --mime-type filename.
Pedro Lobito

@PedroLobito Je pense que la question étroitement liée couvre fileassez bien, mais cette question est différente.
dessert

Je vote cette réponse, étant donné que vous avez été le premier à donner une fileréponse. Comme je l'ai répondu aux autres, cela ne suffit pas (il doit être intégré à ls), je le garde donc lors d'un vote. Je vous remercie.
user10853

1
fichier * est la meilleure réponse
tramada

1
file --mime /dev/*pour lister les mimes dans le répertoire / dev au lieu de current
user1742529

7

Pour plus de clarté, je vais souligner que vous pouvez voir le type de fichier dans un sens de base avec ls, en utilisant l' -Findicateur (classify) qui ajoute un symbole au nom de fichier en fonction de son type:

‘-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.

ls -lCependant, vous pouvez voir ces informations légèrement moins cryptiquement dans la première lettre de la sortie de . La réponse de wjandrea décrit cela plus en détail.

Mais je ne pense pas que ce soit ce que vous entendez par type de fichier. La lscommande ne regarde pas à l'intérieur des fichiers normaux - uniquement sur les listes de répertoires (qui stockent les noms de fichiers) et les inodes (qui stockent les métadonnées, y compris le "type" dans le sens mentionné précédemment).

Ainsi, la lscommande ne peut pas afficher le type de fichier dans le sens qu'il s'agit d'une image JPG ou d'un fichier binaire ou d'un fichier texte ou d'un document LibreOffice quelconque, car il ne contient pas ces informations.

Pour cela, comme le souligne la réponse de singrium , vous avez besoin de la filecommande, qui examine les 50 à 100 premiers Ko environ du contenu des fichiers pour déterminer leur type.


@Zana Merci d'avoir attiré mon attention sur ce drapeau. Cela le ferait pour l'instant même si ce n'est pas ce que je cherchais (types de fichiers réels). Pour cela, je le voterai.
user10853

3

Une forme de type de fichier consiste à savoir si un fichier est un fichier normal, un répertoire, un périphérique, un lien symbolique, etc. lspeut le montrer en utilisant les options -lou -F.

  • L'option -laffichera le type de fichier sous la forme d'un seul caractère au début d'une liste, par exemple:

    $ 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
    

    -est un fichier normal, dun répertoire et lun lien symbolique.

  • L'option -Faffichera le type de fichier sous forme de suffixe, par exemple:

    $ ls -F
    DIR/ FILE LINK@
    

    Où aucun suffixe n'est un fichier normal, /un répertoire et @un lien symbolique.

Plus d'informations à ce sujet sont disponibles en info coreutils 'ls invocation'résumé ici:

Pour -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

Pour -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.