Atravesar el sistema de archivos y mover archivos

Atravesar el sistema de archivos y mover archivos

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 .pngarchivos de esos directorios al directorio deseado. Como aquí utilizamos rutas absolutas, puede ejecutar este script desde cualquier ubicación.

información relacionada