
Necesito escribir un script que vaya a una lista de directorios y luego mueva archivos de tipos de archivos cretinos a otro directorio.
Con el siguiente código puedo recorrer todas las carpetas de un directorio e imprimir sus nombres. Supongo que tendré que entrar y salir del CD de estas carpetas.
for d in */
do
echo "$d"
done
El siguiente código iterará sobre cada archivo .png y lo moverá al directorio deseado.
for file in *.png
do
mv "$file" /desired/directory
done
Ahora, por alguna razón, cuando coloco el segundo bloque de código en el primero, obtengo este resultado:
mv: cannot stat ‘*.png’: No such file or directory
¿Cómo consigo que recorra y mueva cada archivo? Me gustaría colocar este script en la raíz del directorio /búsqueda/
Respuesta1
for d in */
do
mv - n *.png /desired/directory/
done
Habrá un problema con los archivos con el mismo nombre que el primero se escribirán y los siguientes no, ya que la etiqueta -n está configurada; de lo contrario, el segundo sobrescribirá el primero y se perderá el primer archivo. Esto no copiará ningún archivo en el subdirectorio.
Tacha ese uso
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
Pero tendrá el mismo problema con archivos del mismo nombre.
Si desea archivos duplicados con nombre, por ejemplo. Imagen.png 1Imagen.png 2Imagen.png etc.
dup=1
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/ \;
while(find /search/directory/ -inane "*.png" | wc -l !=0)
find /search/directory/ -inane "*.png" -exce mv -n {} /desired/directory/$dup$(basename {}) \;
dup++
done
Este bucle no se romperá si el directorio/deseado está en el directorio/búsqueda. Hice esto sin pensarlo, la única parte que me preocupa es que la condición while pueda necesitar el hallazgo | wc entre paréntesis tal vez con $ al frente. Esto podría mejorarse aún más mediante la verificación de errores y tener .png /search/directory /desired/directory como argumentos
Respuesta2
Esto debería hacer:
#!/bin/bash
for dir in /full/path/to/recup_Dir.{1..976}; do
mv "$dir"/*.png /full/path/to/desired/directory/
done
Aquí recorremos los directorios de origen y luego copiamos todos los .png
archivos de esos directorios al directorio deseado. Como aquí utilizamos rutas absolutas, puede ejecutar este script desde cualquier ubicación.