web-dev-qa-db-fra.com

Comment afficher le type de fichier avec ls?

J'ignore si ls est capable d'afficher une colonne de type de fichier.

Faire une recherche en ligne rapide et une recherche sur man n’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.

Mise à jour

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

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

  • ls -F est une solution ls 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 étant la réponse que je cherche.

8
user10853

file est certainement le bon choix pour obtenir les informations de type de fichier souhaitées. Pour combiner sa sortie avec celle de ls, je suggère d’utiliser find:

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

Cela trouve tous les fichiers du répertoire en cours et imprime la sortie de ls -dils ainsi que la sortie de file -b pour chacun, sur une ligne distincte. 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 type de fichier line mais plutôt d'un type de fichier column, voici un moyen de supprimer le caractère de nouvelle ligne situé 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, alors coupons tout 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 qu’en est-il d’un alias? Avec la ligne suivante dans votre fichier ~/.bash_aliases, il vous suffit d'exécuter lsf pour 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" \;'
12
dessert

Pour plus de clarté, je vais souligner que vous pouvez voir le type de fichier au sens fondamental avec ls, en utilisant le drapeau -F (classify) qui ajoute un symbole au nom du 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.

Vous pouvez toutefois voir ces informations légèrement moins cryptées dans la première lettre de la sortie de ls -l. 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 commande ls ne cherche pas dans les fichiers normaux, mais uniquement dans 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é plus haut).

Ainsi, la commande ls ne peut pas indiquer le type de fichier, qu'il s'agisse d'une image JPG, d'un fichier binaire, d'un fichier texte ou d'un document LibreOffice quelconque, car il ne dispose pas de ces informations.

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

7
Zanna

Je pense que le meilleur moyen d'afficher un type de fichier est d'utiliser cette commande:

file <filename>

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

file *

<code>file *</code> sample from my computer

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

man file
6
singrium

L'une des formes de type de type de fichier est la suivante: un fichier est-il un fichier, un répertoire, un périphérique, un lien symbolique, etc.? ls peut l'indiquer à l'aide des options -l ou -F.

  • L'option -l affichera 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, d est un répertoire et l est un lien symbolique.

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

    $ ls -F
    DIR/ FILE LINK@
    

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

Plus d'informations sur celles-ci sont disponibles dans info coreutils 'ls invocation' , résumées 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
3
wjandrea