web-dev-qa-db-fra.com

Comment trouver toutes les extensions de fichiers récursivement à partir d'un répertoire?

Quelle commande, ou collection de commandes, puis-je utiliser pour renvoyer toutes les extensions de fichier dans un répertoire (y compris les sous-répertoires)?

Pour le moment, j'utilise différentes combinaisons de ls et grep, mais je ne trouve aucune solution évolutive.

44
Matthew

Que dis-tu de ça:

find . -type f -name '*.*' | sed 's|.*\.||' | sort -u
67
thkala
find . -type f | sed 's|.*\.||' | sort -u

Fonctionne également sur mac.

3
marcosdsanchez

répertorier toutes les extensions et leur nombre de sous-répertoires actuels et

ls -1R | sed 's/[^\.]*//' | sed 's/.*\.//' | sort | uniq -c
2
mindon

Boooom un autre:

find * | awk -F . {'print $2'} | sort -u
0
ackuser

J'essayais rapidement ceci car je cherchais une bonne réponse sur Google. Je suis plus enclin à Regex qu'à Bash, mais cela fonctionne également pour les sous-répertoires. Je ne pense pas que les fichiers sans extensions soient inclus:

ls -R | egrep '(\.\w+)$' -o | sort | uniq -c | sort -r

0
Mehcs85

si vous utilisez Bash 4+

shopt -s globstar
for file in **/*.*
do
  echo "${file##*.}
done

Rubis (1.9+)

Ruby -e 'Dir["**/*.*"].each{|x|puts x.split(".")[-1]}' | sort -u
0
kurumi

Encore une autre solution utilisant find (qui devrait même trier correctement les extensions de fichier avec des retours à la ligne intégrés):

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
  printf "%s\000" "${@##*.}"
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n'
0
tooly
ls -1 | sed 's/.*\.//' | sort -u

Mise à jour: vous avez raison Matthew. Sur la base de votre commentaire, voici une version mise à jour:

ls -R1 | egrep -C 0 "[^\.]+\.[^\./:]+$" | sed 's/.*\.//' | sort -u

0
TimeDelta