En una máquina Linux me gustaría recorrer una jerarquía de carpetas y obtener una lista de todas las extensiones de archivo distintas dentro de ella.
¿Cuál sería la mejor manera de lograr esto desde un shell?
linux
grep
filesystems
file-extension
GloryFish
fuente
fuente
.svn
), use lafind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
fuentegit ls-tree -r HEAD --name-only
lugar defind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
No es necesario que la tubería
sort
lo haga, awk puede hacerlo todo:fuente
alias
comando pero el comando en sí ya usa comillas en el comando find. Para solucionar este problema yo usaríabash
Es sintaxis de cadena literal como tan:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
al final del comando 'buscar' y vuelva a ejecutar su prueba.Versión recursiva:
Si desea totales (cuántas veces se vio la extensión):
No recursivo (carpeta única):
He basado esto en esta publicación del foro , el crédito debería ir allí.
fuente
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Potencia Shell:
Gracias a http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
fuente
.
(por ejemplo,jquery-1.3.4
se mostrará como.4
en la salida). Cambie adir -file -recurse | select-object extension -unique
para obtener solo extensiones de archivo.Mi alternativa compatible con POSIX, awk-less, sed-less, Perl-less, Python-less:
El truco es que invierte la línea y corta la extensión al principio.
También convierte las extensiones a minúsculas.
Salida de ejemplo:
fuente
uniq
no tiene la bandera completa--count
, pero-c
funciona bienEncuentra todo con un punto y muestra solo el sufijo.
si sabes que todos los sufijos tienen 3 caracteres, entonces
o con sed muestra todos los sufijos con uno a cuatro caracteres. Cambie {1,4} al rango de caracteres que espera en el sufijo.
fuente
-name "."
cosa porque eso es lo que ya esAgregar 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.
fuente
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
En Python, use generadores para directorios muy grandes, incluidas extensiones en blanco, y obtenga la cantidad de veces que aparece cada extensión:
fuente
Intenté muchas de las respuestas aquí, incluso la "mejor" respuesta. Todos se quedaron cortos de lo que yo buscaba específicamente. Entonces, además de las últimas 12 horas de estar en código regex para múltiples programas y leer y probar estas respuestas, esto es lo que se me ocurrió y funciona EXACTAMENTE como quiero.
Si necesita un recuento de las extensiones de archivo, use el siguiente código
Si bien estos métodos tardarán un tiempo en completarse y probablemente no sean las mejores formas de solucionar el problema, funcionan.
Actualización: las extensiones de archivo largas @ alpha_989 causarán un problema. Eso se debe a la expresión regular 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 tener en cuenta que esos números son el mínimo y el máximo de cuánto tiempo se permite la extensión para la salida final. Cualquier cosa fuera de ese rango se dividirá en varias líneas en la salida.
Nota: La publicación original sí decía "- Greps para extensiones de archivo de entre 3 y 6 caracteres (solo ajuste los números si no se ajustan a sus necesidades). Esto ayuda a evitar archivos de caché y archivos del sistema (el bit del archivo del sistema es buscar en la cárcel). "
Idea: podría usarse para buscar extensiones de archivo de una longitud específica mediante:
Donde 4 es la longitud de las extensiones de archivo a incluir y luego también encuentra cualquier extensión más allá de esa longitud.
fuente
Como ya hay otra solución que usa Perl:
Si tiene instalado Python, también podría hacer (desde el shell):
fuente
Ninguna de las respuestas hasta el momento trata con nombres de archivo con líneas nuevas correctamente (excepto ChristopheD, que apareció cuando estaba escribiendo esto). Lo siguiente no es una línea única de shell, pero funciona, y es razonablemente rápido.
fuente
No creo que este haya sido mencionado todavía:
fuente
Creo que la forma más simple y directa es
Se modificó en la tercera vía de ChristopheD.
fuente
también podrías hacer esto
fuente
Lo he encontrado simple y rápido ...
fuente
La respuesta aceptada usa REGEX y no puede crear un comando de alias con REGEX, debe ponerlo en un script de shell, estoy usando Amazon Linux 2 e hice lo siguiente:
Puse el código de respuesta aceptado en un archivo usando:
sudo vim find.sh
agregue este código:
guarde el archivo escribiendo:
:wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
fuente