Una mini-receta rápida para obtener, de forma recursiva, todas las extensiones de fichero que existan a partir de un directorio dado:
find directorio_raiz -type f -exec sh -c 'basename $0 | sed "s/.*\.//"' {} \; | sort | uniq
El truco viene del archipoderoso sed, que permite obtener las extensión de un fichero mediante la orden sed “s/.*\.//”, y funciona que yo sepa, para cualquier Unix con una shell compatible con sh y find, basename y sed instalados.
Hola, soy yo, como siempre, jodiendo.
Dos cosas: en el “mandato” tienes bien puesta la expresión regular, pero en el texto se te ha traspapelado una barra invertida por un pipe.
Lo segundo es una pregunta (doble): ¿por qué le pasas al script the sh dos veces el nombre del archivo (haces {} {})? ¿no hay que escapar esos corchetes? Yo siempre ando escapándolos.
Jajaja mira que al principio le había puesto un for al find para aplicar el pipe y luego me dije… “espera, seguro que luego viene YoNoSoyTu a decirme que se puede hacer con find”
pero veo que ni aun así me libro
.
He mirado lo que dices (y de paso he borrado una comilla simple que sobraba y no encuentro el pipe que sobra… ¿no será algo de las tipografías, que al estar en cursiva se ve como un pipe? He probado a pegar ambas órdenes (¿éste mejor
?) en la terminal y funcionan bien
Sobre los corchetes… no hace falta escaparlos, al menos en bash (cuando usaba tcsh si que recuerdo que los tenía que escapar). Y no sé porqué le paso dos, bueno, si, porque soy poco hábil
. Pensé que el $0 sería el mandato que le pasas al shell, pero es el primer parámetro. Editado, gracias
Pues tienes toda la razón, es una \ que por el arte de la cursiva se ha convertido en | (un poco borroso, ahora que lo miro de cerca). Ni se me había pasado pegarlo en otro campo de texto para ver el texto real. Siento la falsa alarma.
Y sobre los corchetes, pues muchas gracias, me has ahorrado dos teclas al día.