[SOLUCIONADO] •Contar Archivos Según su Tipo•

Iniciado por X.A.N.A.X, Agosto 13, 2021, 08:34:06 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Agosto 13, 2021, 08:34:06 PM Ultima modificación: Agosto 14, 2021, 02:56:57 PM por DtxdF
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
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
find /Users/Desktop/Micarpeta -type f | sed -n 's/..*\.//p' | sort | uniq -c

Y la salida (por ejemplo):
Código: bash
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


[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
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
¿Que pasa si un objeto imparable choca contra otro inamovible?

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.

Código: php
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
find . -type f | xargs -n 1 basename | egrep '^[^.].*\..*' | grep -o '\..*$' | cut -d. -f2- | sort | uniq -c


~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Agosto 14, 2021, 12:35:09 PM #2 Ultima modificación: Agosto 14, 2021, 03:23:35 PM por X.A.N.A.X
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

$ 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

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.
¿Que pasa si un objeto imparable choca contra otro inamovible?