concatenar comandos

Hola a todos!

Os pido ayuda para un tema de programación en bash. Vaya por delante que no tengo ni idea, pero lo que quiero hacer no creo que tenga mucha dificultad.

Al lío, lo que quiero hacer es crear una carpeta para cada archivo que haya en una carpeta dada. O sea, si yo en mi carpeta musica tengo 3 canciones, quiero crear 3 carpetas con el nombre de cada de las canciones. Algo así como un mkdir (ls).

Me podríais echar un cable, aunque sea recomendarme un manual de bash donde se explique? He buscado un poco por Google, y he leído algo acerca de tuberías y el grep, pero creo que no es lo que yo necesito, no?

Gracias y un saludo!
Sólo necesitas un bucle for que recorra los archivos del directorio, en cualquier manual de bash scripting lo explicarán. Por cierto, que yo sepa no puedes tener un directorio y un archivo con el mismo nombre en el mismo sitio, así que tendrías que tenerlo en cuenta.
Una manera sencilla es con un bucle for y crear una carpeta por cada nombre de archivo existente en el directorio actual:

for archivos in $(ls *); do
        mkdir  $archivos
done


Se podría mejorar quitando la extensión del fichero, etc. Pero este ejemplo es mas sencillo de entender.

Saludos
Mejor:

for f in *; do
   mkdir "$f"
done

Pero eso no va a funcionar
amuchamu escribió:Mejor:

for f in *; do
   mkdir "$f"
done

Pero eso no va a funcionar


Y para que si funcione, quitamos la extension, suponiendo que son *.ogg
for f in *; do
   mkdir "$(basename "$f" .ogg)"
done


XD
JanKusanagi escribió:
amuchamu escribió:Mejor:

for f in *; do
   mkdir "$f"
done

Pero eso no va a funcionar


Y para que si funcione, quitamos la extension, suponiendo que son *.ogg
for f in *; do
   mkdir "$(basename "$f" .ogg)"
done


XD


O, lo que es lo mismo:

for f in *; do
   mkdir "${f%.ogg}"
done

:P
for f in *; do
   mkdir "${f%.ogg}"
done



Perfecto! Para asegurarme de que lo he entendido, el "for f in *" lo que hace es recorrer todos los archivos de una carpeta, no? Pensé que habría que invocar de algún modo el ls, así es más sencillo jeje!
Y el f%.ogg, lo que hace es borrar todos los ogg del final, no? Por eso, si tengo un archivo que acaba en avi por ejemplo, me "borra" el .ogg del final pero como no existe se queda igual y me dice que "no se puede crear el directorio"??

Muchas gracias a todos!
for f in *; do
mkdir "${f%.*}"
done
Para evitar que entren los directorios en el bucle.
find . -maxdepth 1 -type f \( ! -iname ".*" \) -print0 | while read -d $'\0' file; do mkdir ${file%.*}; done
Uh huh

for f in *; do
    n=${f%.*}
    [[ -d ${n} ]] && continue
    mkdir "${n}"
done


O usar mkdir -p

- ferdy
9 respuestas