Estoy intentando escribir un script de shell que encuentre un archivo específico y lo mueva a una carpeta.
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read text2
while :
do
echo -n "Ara:"
read text1
b=$(find /home/cosmoretro 2>/dev/null -iname "$text1"*)
IFS=$'\n'
mv $b /home/cosmoretro/movie/"$text2"
done
Pero también mueve archivos si hay un archivo igual a la carpeta que busco.
Todo lo que quiero es sólo mover la carpeta.
Respuesta1
Me está costando incluso leer este guión. ¿Puedo sugerirle que lo reescriba un poco?
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read destinationFileName
while :
do
echo -n "Ara:"
read sourceFileName
sourceFile=$(find /home/cosmoretro -type d -iname "$sourceFileName" -print -quit 2> /dev/null)
if [[ -z $sourceFile ]]; then
echo "No file named $sourceFileName found"
else
mv -- "$sourceFile" /home/cosmoretro/movie/"$destinationFileName"
fi
done
Qué he hecho:
- Utilice nombres descriptivos como
destinationFileName
en lugar detext2
- Sangrar correctamente
- Haga que
find
solo busque directorios especificando-type d
. Si desea mover sólo archivos, utilice-type f
en lugar de-type d
. - Mueva la redirección al final de un comando ya que no es importante
- Deténgase
find
después de encontrar el primer archivo (-quit
) - Elimine lo superfluo
*
en elfind
comando; no estoy seguro de qué desea tener allí. Si deseaba que los nombres de archivos tuvieran comodines (por ejemplo, la búsquedafoo
devolveríafoobar
), entonces debe colocar el comodínenlas comillas, es decir"$sourceFileName*"
. - Compruebe si se encontró algún archivo con
-z
la prueba si el resultado está vacío. - Protéjase
mv
contra nombres de archivos que comiencen-
usando la opción de fin de opciones--
- Cita los argumentos correctamente para evitar que los espacios en blanco rompan el comando (no es necesario cambiarlos
IFS
entonces)