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:
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
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.
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 ... done
par exemple.sort -u
les supprimera, les lignes doivent être différentes (elles peuvent aussi avoir un nombre différent d'espaces, ce qui les rend non identiques).Je ferais probablement quelque chose comme ça -
Cela recherchera à partir du chemin actuel, les fichiers (par exemple, aucun répertoire) et exécutera ensuite la
file
commande sur chaque fichier.la source
Essaye ça:
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
la source
ls
file -b *
place dels | xargs file -b
pour éviter l'analysels
.