Sur une machine Linux, je voudrais parcourir une hiérarchie de dossiers et obtenir une liste de toutes les extensions de fichiers distinctes en son sein.
Quelle serait la meilleure façon d'y parvenir à partir d'un shell?
linux
grep
filesystems
file-extension
GloryFish
la source
la source
.svn
), utilisezfind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
sourcegit ls-tree -r HEAD --name-only
place defind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Pas besoin de tuyau
sort
, awk peut tout faire:la source
alias
commande, mais la commande elle-même utilise déjà des guillemets dans la commande find. Pour résoudre ce problème, j'utiliseraisbash
la syntaxe de chaîne littérale de:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
à la fin de la commande 'find' et relancez votre test.Version récursive:
Si vous voulez des totaux (combien de fois l'extension a-t-elle été vue):
Non récursif (dossier unique):
J'ai basé cela sur ce message sur le forum , le crédit devrait y aller.
la source
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Powershell:
Merci à http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
la source
.
(par exemple,jquery-1.3.4
ils apparaîtront comme.4
dans la sortie). Changez pourdir -file -recurse | select-object extension -unique
obtenir uniquement les extensions de fichier.Mon alternative sans souci, sans sed, sans Perl, sans Python, conforme à POSIX:
L'astuce est qu'elle inverse la ligne et coupe l'extension au début.
Il convertit également les extensions en minuscules.
Exemple de sortie:
la source
uniq
n'a pas le drapeau complet--count
, mais-c
fonctionne très bienTrouvez tout avec un point et n'affichez que le suffixe.
si vous savez que tous les suffixes ont 3 caractères,
ou avec sed affiche tous les suffixes avec un à quatre caractères. Remplacez {1,4} par la plage de caractères attendue dans le suffixe.
la source
-name "."
chose parce que c'est déjà ce que c'estAjout de ma propre variation au mix. Je pense que c'est le plus simple du lot et peut être utile lorsque l'efficacité n'est pas une grande préoccupation.
la source
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
En Python, utiliser des générateurs pour de très gros répertoires, y compris des extensions vides, et obtenir le nombre de fois où chaque extension apparaît:
la source
J'ai essayé un tas de réponses ici, même la "meilleure" réponse. Ils sont tous restés en deçà de ce que je cherchais spécifiquement. Donc, en plus des 12 dernières heures passées en code regex pour plusieurs programmes et en lisant et en testant ces réponses, c'est ce que j'ai trouvé qui fonctionne exactement comme je le souhaite.
Si vous avez besoin d'un nombre d'extensions de fichiers, utilisez le code ci-dessous
Bien que ces méthodes prennent un certain temps à compléter et ne soient probablement pas les meilleures façons de résoudre le problème, elles fonctionnent.
Mise à jour: les extensions de fichier longues selon @ alpha_989 entraîneront un problème. Cela est dû à l'expression régulière "[[: alpha:]] {3,6}". J'ai mis à jour la réponse pour inclure l'expression régulière "[[: alpha:]] {2,16}". Cependant, toute personne utilisant ce code doit être conscient que ces nombres sont le minimum et le maximum de la durée pendant laquelle l'extension est autorisée pour la sortie finale. Tout ce qui est en dehors de cette plage sera divisé en plusieurs lignes dans la sortie.
Remarque: le message d'origine a lu "- Greps pour les extensions de fichier entre 3 et 6 caractères (ajustez simplement les nombres s'ils ne correspondent pas à vos besoins). Cela permet d'éviter les fichiers de cache et les fichiers système (le bit du fichier système est pour rechercher en prison). "
Idée: pourrait être utilisée pour trouver des extensions de fichier sur une longueur spécifique via:
Où 4 est la longueur des extensions de fichier à inclure, puis recherchez également toutes les extensions au-delà de cette longueur.
la source
Puisqu'il existe déjà une autre solution qui utilise Perl:
Si vous avez installé Python, vous pouvez également faire (à partir du shell):
la source
Jusqu'à présent, aucune des réponses ne traite correctement des noms de fichiers avec des sauts de ligne (à l'exception de ChristopheD, qui vient d'arriver au moment où je tapais ceci). Ce qui suit n'est pas un one-liner shell, mais fonctionne et est assez rapide.
la source
Je ne pense pas que celui-ci ait encore été mentionné:
la source
Je pense que la manière la plus simple et la plus directe est
Il est modifié sur la 3ème voie de ChristopheD.
la source
vous pouvez aussi faire ça
la source
Je l'ai trouvé simple et rapide ...
la source
La réponse acceptée utilise REGEX et vous ne pouvez pas créer une commande d'alias avec REGEX, vous devez la mettre dans un script shell, j'utilise Amazon Linux 2 et j'ai fait ce qui suit:
Je mets le code de réponse accepté dans un fichier en utilisant:
sudo vim find.sh
ajoutez ce code:
enregistrez le fichier en tapant:
:wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
la source