texto por crear contenido consola con comando buscar archivos archivo linux grep filesystems file-extension

linux - por - comando find unix



¿Cómo puedo encontrar todas las distintas extensiones de archivos en una jerarquía de carpetas? (12)

En una máquina con Linux me gustaría recorrer una jerarquía de carpetas y obtener una lista de todas las distintas extensiones de archivos dentro de ella.

¿Cuál sería la mejor manera de lograr esto desde un caparazón?


Agregando mi propia variación a la mezcla. Creo que es el más simple de todos y puede ser útil cuando la eficiencia no es una gran preocupación.

find . -type f | grep -o -E ''/.[^/.]+$'' | sort -u


Como ya hay otra solución que usa Perl:

Si tiene Python instalado, también podría hacerlo (desde el shell):

python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk(''/home'')];print ''/n''.join(e)"


Creo que la forma más simple y directa es

for f in *.*; do echo "${f##*.}"; done | sort -u

Está modificado en la tercera manera de ChristopheD.


En Python, se usan generadores para directorios muy grandes, incluidas las extensiones en blanco, y se obtiene el número de veces que aparece cada extensión:

import json import collections import itertools import os root = ''/home/andres'' files = itertools.chain.from_iterable(( files for _,_,files in os.walk(root) )) counter = collections.Counter( (os.path.splitext(file_)[1] for file_ in files) ) print json.dumps(counter, indent=2)


Encuentra todo con un punto y muestra solo el sufijo.

find . -type f -name "*.*" | awk -F. ''{print $NF}'' | sort -u

si sabes que todos los sufijos tienen 3 caracteres, entonces

find . -type f -name "*.???" | awk -F. ''{print $NF}'' | sort -u

o con sed muestra todos los sufijos con uno a cuatro caracteres. Cambie {1,4} al rango de caracteres que espera en el sufijo.

find . -type f | sed -n ''s/.*/./(./{1,4/}/)$//1/p''| sort -u


Intenté varias respuestas aquí, incluso la "mejor" respuesta. Todos se quedaron cortos de lo que específicamente estaba buscando. Entonces, además de las últimas 12 horas de estar sentado en el código de expresiones regulares para múltiples programas y leer y probar estas respuestas, esto es lo que se me ocurrió que funciona EXACTAMENTE como yo quiero.

find . -type f -name "*.*" | grep -o -E "/.[^/.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk ''{print tolower($0)}'' | sort -u

  • Encuentra todos los archivos que pueden tener una extensión.
  • Greps solo la extensión
  • Greps para extensiones de archivo de entre 2 y 16 caracteres (simplemente ajuste los números si no se ajustan a sus necesidades). Esto ayuda a evitar los archivos de caché y del sistema (el bit del archivo del sistema es buscar en la cárcel).
  • Awk para imprimir las extensiones en minúsculas.
  • Ordenar y traer solo valores únicos. Originalmente había intentado probar la respuesta awk, pero imprimía dos veces elementos que variaban en mayúsculas y minúsculas.

Si necesita un recuento de las extensiones de archivo, utilice el siguiente código

find . -type f -name "*.*" | grep -o -E "/.[^/.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk ''{print tolower($0)}'' | sort | uniq -c | sort -rn

Si bien estos métodos tomarán algún tiempo para completarse y probablemente no sean la mejor manera de resolver el problema, funcionan.

Actualización: Per @ alpha_989 largas extensiones de archivos causarán un problema. Eso se debe a la expresión original "[[: alpha:]] {3,6}". He actualizado la respuesta para incluir la expresión regular "[[: alpha:]] {2,16}". Sin embargo, cualquiera que use este código debe saber que esos números son el mínimo y el máximo de la extensión permitida para el resultado final. Cualquier cosa fuera de ese rango se dividirá en múltiples líneas en la salida.

Nota: La publicación original decía "- Greps para extensiones de archivos de entre 3 y 6 caracteres (simplemente ajuste los números si no se ajustan a sus necesidades). Esto ayuda a evitar los archivos de caché y del sistema (el bit del sistema es buscar en la cárcel). "

Idea: podría usarse para buscar extensiones de archivos en una longitud específica a través de:

find . -type f -name "*.*" | grep -o -E "/.[^/.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk ''{print tolower($0)}'' | sort -u

Donde 4 es la longitud de las extensiones de archivo para incluir y luego encontrar también cualquier extensión más allá de esa longitud.


Ninguna de las respuestas hasta ahora trata los nombres de archivos con nuevas líneas correctamente (a excepción de ChristopheD, que acaba de entrar mientras escribía esto). La siguiente no es una línea de comandos de shell, pero funciona, y es razonablemente rápida.

import os, sys def names(roots): for root in roots: for a, b, basenames in os.walk(root): for basename in basenames: yield basename sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:])) for suf in sufs: if suf: print suf


No es necesario sort la tubería, awk puede hacerlo todo:

find . -type f | awk -F. ''!a[$NF]++{print $NF}''



Pruebe esto (no estoy seguro si es la mejor manera, pero funciona):

find . -type f | perl -ne ''print $1 if m//.([^.//]+)$/'' | sort -u

Funciona de la siguiente manera:

  • Encuentra todos los archivos de la carpeta actual
  • Imprime la extensión de archivos si hay alguna
  • Haga una lista ordenada única

Versión recursiva:

find . -type f | sed -e ''s/.*/.//'' | sed -e ''s/.*////'' | sort -u

Si desea totales (¿cómo pueden verse las veces la extensión?):

find . -type f | sed -e ''s/.*/.//'' | sed -e ''s/.*////'' | sort | uniq -c | sort -rn

No recursivo (una sola carpeta):

for f in *.*; do printf "%s/n" "${f##*.}"; done | sort -u

Basé esto en esta publicación en el foro , el crédito debería ir allí.


también podrías hacer esto

find . -type f -name "*.php" -exec PATHTOAPP {} +