Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: X.A.N.A.X en Agosto 13, 2021, 08:34:06 PM

Título: [SOLUCIONADO] •Contar Archivos Según su Tipo•
Publicado por: X.A.N.A.X en Agosto 13, 2021, 08:34:06 PM
Hola a todos.


Hace tiempo encontré un comando muy curioso para contar archivos según su extensión en un directorio.

(Lo encontré en otro foro, pero aún no conocía Underc0de, así que no son cuernos.)

Abrimos terminal (obvio) introducimos:

Código (bash) [Seleccionar]
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c

Despues de find hay un espacio, luego un punto( que es el directorio actual)es decir la ruta, y después otro espacio antes del siguiente comando.

En el caso de ser otra ruta, la entrada sería:

Código (bash) [Seleccionar]
find /Users/Desktop/Micarpeta -type f | sed -n 's/..*\.//p' | sort | uniq -c
Y la salida (por ejemplo):
Código (bash) [Seleccionar]
5 pdf
8 jpg
16 mp3
11 html
6 gif
1 mp4
3 rar





Es simple, pero parece que falta un listado recursivo de cada subdirectorio y sus correspondientes contadores, he probado varias formas pero no doy con la tecla.


La idea sería una salida tal como:

Código (bash) [Seleccionar]


[email protected][/root/moods]-$ [comando modificado]
_____________
/root/moods:
   >>> 7 pdf
   >>> 1004 json
   >>> 3 py
________________________
/root/moods/Micarpeta:
   >>> 5 exe
   >>> 7 img
   >>> 27 zip
   >>> 12 txt
_____________________________________
/root/moods/Micarpeta/Subcarpeta1:
   >>> 8 jpg
   >>> 16 mp3
   >>> 11 html
   >>> 6 gif
   >>> 1 mp4
   >>> 3 rar
_____________________________________
/root/moods/Micarpeta/Subcarpeta2:                         
    >>> 4 mkv
    >>> 3 img
    >>> 1 mp3
    >>> 45 php
_______________________________________________
/root/moods/Micarpeta/Subcarpeta2/Carpeta3:
   <<< 102 png
   <<< 13 txt
   <<< 34 exe


Así se vería algo parecido al contador recursivo.

¿Alguien sabe que és lo que falla?



XaNAxAnAx
x.a.n.a.x
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

Título: Re: •Contar Archivos Según su Tipo•
Publicado por: DtxdF en Agosto 13, 2021, 10:19:45 PM
Es mejor colocar una salida real y no inventarla. Puede ser confuso leerlo.

Con real me refiero a una estructura tipo arbol estilo lo que hace el comando tree(1) o simplemente separando el directorio y subdirectorio con una barra diagonal.

carpeta/
carpeta/subcarpeta1/
carpeta/subcarpeta2/
carpeta/subcarpeta2/otra


Dicho lo anterior, no hay nada erróneo en los comandos. find(1) está haciendo su trabajo mostrándote los archivos de forma recursiva. La cuestión es que find(1) buscará desde la ruta actual hasta los siguientes niveles de jerarquía. Si estás en subcarpeta2/ que a su vez ésta está en carpeta/, y ejecutas find(1), éste no buscará en subcarpeta1/ ya que no la puede "ver".

Por cierto, aunque el comando esté bien, hay veces en que se tiene un archivo con más de una extensión (.tar.xz, por ejemplo) y también hace una suposición implícita de que los archivos ocultos (los que comienzan con un punto [.]) son también extensiones. Este podría servir también:

Código (bash) [Seleccionar]
find . -type f | xargs -n 1 basename | egrep '^[^.].*\..*' | grep -o '\..*$' | cut -d. -f2- | sort | uniq -c

~ DtxdF
Título: Re: •Contar Archivos Según su Tipo•
Publicado por: X.A.N.A.X en Agosto 14, 2021, 12:35:09 PM
Gracias bro!!! Voy a editarlo cuanto antes, por cierto, tienes razón, no habia pensado lo que pasaría con los archivos ocultos y de varias extensiones. Saludos DtxdF ;)

Por cierto, aquí dejo una comparación simple por si a alguien le interesa la diferencia:

Vemos que muestra los bash y python_history, estando ocultos, pero porque los detecta como extension (.python_history) pero supongo que será porque está en la carpeta madre.
Código (bash) [Seleccionar]

$ find . -type f | sed -n 's/..*\.//p' | sort | uniq -c                                                       

      1 bash_history
      1 xz
      2 gif
      1 img
      1 iso
      1 python_history
      6 txt
      1 zip


Aquí vemos que hay un xz (que no es xz, sino tar.xz) que con el comando de DtxdF si nos muestra.

Código (bash) [Seleccionar]

find . -type f | xargs -n 1 basename | egrep '^[^.].*\..*' | grep -o '\..*$' | cut -d. -f2- | sort | uniq -c
   
      1 tar.xz         (*)
      2 gif
      1 img
      1 iso
      7 txt               (*)
      1 zip         


Y por supuesto, identificó un txt nuevo que estaba oculto.