Rsync para copiar subcarpetas y archivos específicos a un nuevo directorio

Rsync para copiar subcarpetas y archivos específicos a un nuevo directorio

Ruta original, RootFolderI:

RootFolderI/FolderA/Subfolder1/Subsub1/JPG1.jpg -> want this jpg
RootFolderI/FolderA/Subfolder2/Subsub1/JPG2.jpg -> want this jpg
RootFolderI/FolderA/Subfolder2/Subsub2/JPG3.jpg
. . .
RootFolderI/FolderB/Subfolder1/Subsub1/JPG4.jpg -> want this jpg
RootFolderI/FolderB/Subfolder2/Subsub1/JPG5.jpg -> want this jpg
RootFolderI/FolderB/Subfolder3/Subsub2/JPG6.jpg
...

Hay muchas carpetas CarpetaA/B/C/etc, pero la estructura de las carpetas dentro es siempre la misma (excepto los archivos, son diferentes)


Quiero copiar a RootFolderII:

  • solo toda la Carpeta A/B/etc.
  • todos los archivos en Subsub1

...El resultado es esta nueva ruta, RootFolderII:

RootFolderII/FolderA/ with JPG1.jpg, JPG2.jpg
RootFolderII/FolderB/ with JPG4.jpg,JPG5.jpg

En este momento tengo el siguiente código (pero no funciona):

rsync -r --include='Folder*/Subfolder1/Subsub1/***' --exclude="/*/*/" /RootFolderI/ /RootFolderII/

Dónde

--exclude="/*/*/" : crea CarpetaA/B/... -> trabajando

--include='Folder*/Subfolder1/Subsub1/***' : quiero copiar todos los archivos (no la estructura)... -> no funciona

???bueno, creo que incluso si funcionara, copiaría archivos de la Carpeta B a la Carpeta A, ¡y no quiero eso!

Respuesta1

Dale una oportunidad a esto.

rsync -r --include='*.jpg' --exclude="*" /RootFolderI/Folder*/Subfolder1/Subsub1/. /RootFolderII/.

Respuesta2

Lo que hice:

  • rsynccon incluye y excluye

  • Mover archivos hacia arriba (2 niveles arriba)

    find /folder/ -type f -mindepth 3 -execdir mv -t ../../ -- {} +
    
  • Eliminar carpetas vacías

    find /folder/*/ -type d -empty -delete
    

Respuesta3

No creo que lo usaría rsyncpara esta tarea. (No existe un algoritmo delta, por lo que se puede ganar poco usándolo). Aquí hay una versión que usa cp:

for rfipath in RootFolderI/*
do
    folder="${rfipath/*\/}"
    mkdir -p "RootFolderII/$folder"
    cp -p "$rfipath"/*/Subsub1/* "RootFolderII/$folder"
done

Producción

RootFolderII/FolderA/JPG1.jpg
RootFolderII/FolderA/JPG2.jpg
RootFolderII/FolderB/JPG4.jpg
RootFolderII/FolderB/JPG5.jpg

Si realmente quieres usar rsync, reemplaza la cplínea con esta. Obtendrá los tiempos de modificación de los directorios:

for folder in RootFolderI/*
do
    rsync -a "$folder"/*/Subsub1/ "RootFolderII/${folder/*\/}"
done

información relacionada