Respuestas:
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:
git 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:
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
comando pero el comando en sí ya usa comillas en el comando find. Para solucionar este problema yo usaría bash
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:
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Si desea totales (cuántas veces se vio la extensión):
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
No recursivo (carpeta única):
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
He basado esto en esta publicación del foro , el crédito debería ir allí.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Potencia Shell:
dir -recurse | select-object extension -unique
Gracias a http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
.
(por ejemplo, jquery-1.3.4
se mostrará como .4
en la salida). Cambie a dir -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:
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
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:
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
no tiene la bandera completa --count
, pero -c
funciona bien
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
Agregar 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
$ 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:
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)
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.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
Si necesita un recuento de las extensiones de archivo, use 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 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:
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 a incluir y luego también encuentra cualquier extensión más allá de esa longitud.
Como ya hay otra solución que usa Perl:
Si tiene instalado Python, también podría hacer (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)"
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.
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 creo que este haya sido mencionado todavía:
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
Lo he encontrado simple y rápido ...
# find . -type f -exec basename {} \; | awk -F"." '{print $NF}' > /tmp/outfile.txt
# cat /tmp/outfile.txt | sort | uniq -c| sort -n > tmp/outfile_sorted.txt
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:
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
guarde el archivo escribiendo: :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), use lafind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
fuente