Liste toutes les extensions uniques pour les fichiers contenus dans un répertoire

10

Je voudrais voir toute l'extension unique des fichiers contenus dans un certain répertoire. Quelle est la commande pour faire ça en bash?

On pourrait utiliser find . -type fpour obtenir tous les fichiers dans le répertoire actuel, puis supprimer l'extension et la diriger vers uniq. Quelle est la façon la plus simple de supprimer l'extension?

dzhelil
la source

Réponses:

14

Essaye ça:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

Il ne produit rien pour:

  • Fichiers sans extension
  • Fichiers dont le nom se termine par un point
  • Fichiers cachés

Il peut également être utile de le diriger vers sort | uniq -c.

En pause jusqu'à nouvel ordre.
la source
Ne fonctionne pas avec le sed par défaut sur mon Mac. Je reçoissed: illegal option -- r
dzhelil
8
@celil: utilisez -Eau lieu de -rsur OS X.
pause jusqu'à nouvel ordre.
3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Fonctionne sur OS X, sauf pour les fichiers sans extension. Mon dossier de téléchargements:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

Vous pourriez avoir besoin à la sed -rplace?


Problème mineur: les fichiers sans extension affichent leur nom. Les fichiers cachés (tels que .DS_Store) impriment leur nom sans être précédés ..

Daniel Beck
la source
Je recommanderais sort -uplutôt sort | uniq. Moins de fourches et d'utilisation des ressources.
John T
Merci @John. J'ai essayé de rester dans le "cadre" de celil, donc je n'y ai pas pensé.
Daniel Beck
Il n'est pas nécessaire d'échapper à un point à l'intérieur [].
pause jusqu'à nouvel ordre.
3

Voici encore une autre solution qui ne se confond pas avec les noms de fichiers contenant des sauts de ligne incorporés et les utilise sort -uzpour trier correctement les extensions de fichiers qui peuvent également avoir des sauts de ligne intégrés:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl
outillé
la source
3

Un moyen rapide et facile à retenir pour supprimer l'extension est de supposer que tous les noms de fichiers ont le format "nom.ext" puis utilisez:

 ls -1 | cut -d"." -f2- | sort | uniq -c

cela donne le nombre d'extensions uniques, par exemple:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  
jcloos
la source
1

voyez, c'est pourquoi j'aime awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
banquier
la source