Ayuda script bash ruta de directorio en variable

Que tal, buenas noches!

Estoy aprendiendo a crear scripts en bash, y estoy haciendo un script el cual te mueve todos los ficheros de las extensiones que tu le indiques de una ruta origen a una ruta destino. Este script es solo didactico, pues estoy practicando el uso de for e if.

El script es el siguiente:

#!/bin/bash

echo "Escribe la ruta donde se encuentran los archivos a mover"
read ruta_origen

if [ -d "$ruta_origen" ]
   then
      echo "Escribe las extensiones separadas por comas de los tipos de archivos a mover"
      read extensiones

      echo "Escribe la ruta donde quieres mover tus archivo..."
      read ruta_destino

      if [ -d "$ruta_destino" ]
         then

            ls "$ruta_origen"*.{"$extensiones"} > /tmp/lista_archivos.txt

            for linea in $(cat /tmp/lista_archivos.txt)
            do   
               mv ${ruta_origen}$linea $ruta_destino
            done
            clear
            echo "Los archivos se movieron correctamente"
         else
            echo "El directorio no existe, no se puede continuar"
      fi

   else
      echo "El directorio no existe, no se puede continuar"
fi


El script almacena en una variable la ruta_origen, en otra la ruta_destino y en una tercera las extensiones que tiene que mover. Sin embargo al llamar dos variables en la instruccion del comando ls lo hago de la siguiente manera: ls "$ruta_origen"*.{"$extensiones"}. El problema que el script al llegar a esa linea, me indica que la ruta no existe, cuando el error mostrado me muestra realmente la ruta que es, pero el interprete bash muestra que no, que no existe. Que pasa?


He buscado por internet, pero no encuentro nada...

Alguna idea?

Gracias!
ls "$ruta_origen"*.{"$extensiones"}

¿Y con ese engendro que quieres hacer exactamente? :P

El ls te dice que no existe el fichero porque el * se expande en base al contenido que exista en el directorio que le estas pasando como argumento y en este caso quedaría algo asi:

ls /home/loquesea/*.{txt,dmg,iso} -> como no existe ningún fichero que satisfaga la expansión del *, entonces el bash pasa ese string literal feo al ls y obviamente el ls te dice a ti que no existe nada con ese nombre raro.

Reemplaza el ls por un echo y te darás cuenta facilmente del problema.
Jajaja, engendro, no lo creo, pues segun yo tiene sentido:

ls "$ruta_origen"*.{"$extensiones"}

Se supone (al menos de lo poco que he aprendido) es que despues del "ls" la variable "$ruta_origen" pasara como argumento la ruta que se le ingreso con el comando read, y en extensiones pasara como argumento las extensiones que se escribieron con read.

Quedando asi: ls /ruta/escrita/por/el/usuario/*.{jpg,iso,mp3}

Al dar un echo a ese "engendro" XD aparece correctamente la ruta:

echo "$directorio"*."{$extensiones}"

resultado en mi caso: /Users/Kenshin/Desktop/*.{docx,jpg}

Por tanto la ruta es correcta, quedando asi: ls /Users/Kenshin/Desktop/*.{docx,jpg}

SIN EMBARGO NO FUNCIONA, pero si ejecuto esta orden completa, directamente desde el interprete bash: ls /Users/Kenshin/Desktop/*.{docx,jpg}, me muestra solo los archivos con extension .docx,jpg

En teoria, es correcto lo que estoy haciendo, sin embargo en el script, bash me lo interpreta con error, diciendome que no existe la ruta, pero si ejecuto esa instruccion directamente desde el interprete, no me muestra error alguno, mostrandome correctamente los resultados:

/Users/Kenshin/Desktop/2011-01-31_17-35-28_247.jpg /Users/Kenshin/Desktop/La Capa de Ozono_.docx
/Users/Kenshin/Desktop/ACTIVIDAD_5._LECTURA_DE_MAPAS_HISTORICOS.docx /Users/Kenshin/Desktop/La capa de ozono.docx
/Users/Kenshin/Desktop/Actividad5 lesctura de mapas historicos.docx /Users/Kenshin/Desktop/La_capa_de_ozono_Omar_talavera.docx
/Users/Kenshin/Desktop/Foto del día 29-09-2010 a la(s) 22:40.jpg /Users/Kenshin/Desktop/REQUERIMIENTOS ENERGETICOS.docx
/Users/Kenshin/Desktop/La Capa de Ozono.docx /Users/Kenshin/Desktop/actividad final.docx
Interesante post. A mí tambien me gustaría aprender Bash en mac... estaré pendiente haber si me entero de algo :p
Prueba a usar ** en lugar de usar *. , es decir, echo "$directorio"*{$extensiones}*"

o

ls "$ruta_origen"*{"$extensiones"}
4 respuestas