Comment afficher tous les types de fichiers contenus dans un répertoire?

12

Y a-t-il une commande qui me dit dans le répertoire spécifique quels types de fichiers existent?

Je peux trouver le type de fichier en utilisant une commande comme od -c myfile | less.

Mais je ne sais pas comment le faire pour tous les fichiers d'un répertoire.

Mohammad Reza Rezwani
la source

Réponses:

19

Bien od -cqu'il affiche en effet le contenu d'un fichier, ce n'est pas un bon moyen d'obtenir son type de fichier. Certains fichiers contiennent un en-tête avec le type de fichier, mais pas tous. Une meilleure façon est la commande file:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

Ainsi, pour obtenir une liste de tous les types de fichiers dans un répertoire, vous pouvez faire:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

Exemple de sortie:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

Explication

  • for file in dir/*; do ... done;: parcourez tout ce qui se trouve dans dir( dirc'est juste un exemple, vous devez le changer pour le nom du répertoire réel que vous souhaitez rechercher), en enregistrant chaque élément à son tour comme$file
  • file "$file": exécuter filesur chacun des éléments trouvés.
  • cut -d: -f 2: imprime uniquement le deuxième champ (champs définis par :)
  • sed 's/^ //; s/ +/ /g' : supprime les espaces du début de la ligne et convertit les espaces consécutifs en un seul espace.
  • sort -u : supprimer les types de fichiers en double
terdon
la source
merci, mais je copie et colle exactement "pour le fichier dans dir / *; fais le fichier" $ file "| cut -d: -f 2 | sort -u; done" dans mon terminal et j'ai "ERREUR"
Mohammad Reza Rezwani
2
@alex tout d'abord, veuillez toujours mentionner l'erreur exacte que vous obtenez, en disant que vous avez obtenu "ERREUR" n'est pas très utile. Dans tous les cas, l'erreur est probablement due au fait que vous n'avez aucun répertoire nommé dir/, c'était juste un exemple de nom, vous devrez le changer en nom d'un vrai répertoire: for file in /home/alex/*; do ... donepar exemple.
terdon le
merci, si vous avez fait mon mauvais travail (... je pensais que dir est une commande comme ls pas un répertoire -désolé- je pense aussi qu'il vaut mieux éditer votre réponse) Vous voyez juste "ERREUR" et rien d'autre.
Mohammad Reza Rezwani
beau travail, thnaks, mais j'ai vu par exemple quatre lignes "Fichier audio avec ID3 version 2.3.0, contient" ou plusieurs "ISO Media, système MPEG v4, version 2". Je ne suis pas sûr de "supprimer les doublons".
Mohammad Reza Rezwani
@alex assez juste, réponse éditée. Vous ne devriez pas recevoir de doublons. Le sort -ules supprimera, les lignes doivent être différentes (elles peuvent aussi avoir un nombre différent d'espaces, ce qui les rend non identiques).
terdon le
3

Je ferais probablement quelque chose comme ça -

find . -type f -exec file {}  \;

Cela recherchera à partir du chemin actuel, les fichiers (par exemple, aucun répertoire) et exécutera ensuite la filecommande sur chaque fichier.

Elliott Frisch
la source
1

Essaye ça:

ls | xargs file -b | sort | uniq

Comment ça fonctionne:

ls : liste le contenu du répertoire

fichier -b : déterminer le type de fichier; ne pas ajouter de noms de fichiers aux lignes de sortie

trier : trier les lignes

uniq : omettre les lignes répétées

Wolfy
la source
1
Vous pouvez utiliser à la file -b *place de ls | xargs file -bpour éviter l'analyse ls.
wjandrea