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.
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" \;'
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.
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
Où -
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