PDA

Ver la versión completa : [Ayuda] Listar archivos sin la extension en unix. ( Mac OS X )



ArChEr
09/05/2012, 04:19
Muy buenas pues necesito listar los archivos de un directorio en el terminal de Mac OS X pero que aparezcan sin la extension, solo el nombre del archivo.



Un saludo y gracias!

Jurk
09/05/2012, 08:44
lista los todos archivos
lista los archivoos tipo *.*

lista aquellos que solo esten en la primera lista

JoJo_ReloadeD
09/05/2012, 09:20
ls | cut -d "." -f1

juanvvc
09/05/2012, 11:53
Lo bueno de la solución de JoJo es que es muy sencilla de entender y gracias a las pipes muy estándar. Lo malo es que falla si los nombres de archivos tienen varios puntos. Te propongo otra:

for i in *; do echo ${i%.*}; done

Esta sí que manejará bien los nombres de archivo con varios puntos. Lo malo de esta solución es que solo funciona en bash (y no recuerdo si OS X usa bash) y seguro que tiene otros fallos. El más obvio: los archivos ocultos que empieza por . y sin extensión.

FALLA: for i in `ls .* -d`; do echo ${i%.*}; done

JoJo_ReloadeD
09/05/2012, 11:59
Lo bueno de la solución de JoJo es que es muy sencilla de entender y gracias a las pipes muy estándar. Lo malo es que falla si los nombres de archivos tienen varios puntos. Te propongo otra:

for i in *; do echo ${i%.*}; done

Lo malo de esta solución es que solo funciona en bash (y no recuerdo si OS X usa bash) y seguro que tiene otros fallos.

no... no falla aunque tengan varios puntos... asumo que lo que hay antes del punto es el nombre del fichero y es lo unico que devuelvo...

juanvvc
09/05/2012, 12:28
Por supuesto, depende de la lista concreta :brindis: Un ejemplo real de mi disco duro:



$ ls
comic.01.cbr comic.02.cbr comic.03.cbr
$ ls | cut -d '.' -f1
comic
comic
comic
$ for i in *; do echo ${i%.*}; done
comic.01
comic.02
comic.03


Otro ejemplo en que tu solución me parece más correcta que la mía:



/lib$ ls libncurses*
libncurses.so.5 libncurses.so.5.9 libncursesw.so.5 libncursesw.so.5.9
/lib$ ls libncurses* | cut -d '.' -f1
libncurses
libncurses
libncursesw
libncursesw
/lib$ for i in libncurses*; do echo ${i%.*}; done
libncurses.so
libncurses.so.5
libncursesw.so
libncursesw.so.5


---------- Post added at 12:26 ---------- Previous post was at 12:23 ----------

Aunque también es posible complicar la expresión del bash para que se comporte como el cut, aunque en mi opinión esta complicación ya es absurda y para eso mejor el cut, sin duda:


/lib$ for i in libncurses*; do echo ${i%%.*}; done
libncurses
libncurses
libncursesw
libncursesw


---------- Post added at 12:28 ---------- Previous post was at 12:26 ----------

(no intento discutir, solo aprender y comparar lo que ya sé con cosas nuevas :brindis: Por ejemplo, tu solución me ha recordado la orden 'cut' que hace siglos que no usaba en favor de la manipulación de strings del bash y awk. Pero 'cut' es mucho mejor en situaciones simples, sin duda, y la tenía olvidada.

Por otro lado, quitar las extensiones de un nombre de archivo es un problema común que tengo en Linux. Tan común que me he acabado creando un script complejo que maneja muchos casos especiales)

ArChEr
09/05/2012, 14:21
venga mas dificil todavia... comprimir todas las roms de md cada una en un zip.

JoJo_ReloadeD
09/05/2012, 15:39
venga mas dificil todavia... comprimir todas las roms de md cada una en un zip.

jajaja, esto es como el que pedia las practicas que le mandaban en el modulo no? :)

luego te lo miro, pero vamos, for y zip son tus amigos ;)

SplinterGU
09/05/2012, 16:06
venga mas dificil todavia... comprimir todas las roms de md cada una en un zip.

archer, eso podria ser mas simple de lo que planteaste originalmente...

por que por favor no dices que es exactamente lo que necesitas hacer? conoces la extension de los archivos que quieres quitarle la extension?

JoJo_Reloaded, lo que dice juanvvc tiene razon, con el cut solo obtienes lo que hay delante del primer punto, pero no siempre lo que hay despues del primer punto es la extension, yo diria que salvo las .so, los demas archivos que mas de 1 punto, el 90% no son extension despues del primer punto. ademas la arruinas con los archivos ocultos, ahi el punto es lo que aparece primero.

archer, si conoces la extension puedes usar basename

basename archivo .extension

ejemplo

basename pacman.zip .zip

eso te da

pacman

ArChEr
09/05/2012, 16:23
Al final he echo un programa en xcode que pilla los nombres de todas las roms y las comprime en zip individualmente... porque al hacerlo a saco solo con zip me añadía .zip al final del .gen y quedaba feísimo... ejemplo ( "Rolo to the Rescue.gen.zip" )

De la forma que decía Jojo pasaba lo que decía juanvvc que algunas roms que tenian puntos por en medio del nombre se partian y daba error al no encontrar el archivo...

SplinterGU
09/05/2012, 16:30
es importante cuando uno quiere hacer algo, explicar exactamente lo que quiere hacer para que pueda darsele la solucion adecuada... en tu caso la solucion correcta y simple hubiese sido:



for i in *.gen; do zip $(basename $i .gen).zip $i; done

Nathrezim
09/05/2012, 16:33
ls |sed 's/\.[^\.]*$//g'

Si, esto es una sentencia de UNIX y además funciona!!