Copie archivos específicos y mantenga la estructura de subcarpetas

Obtuve una carpeta con una gran cantidad de archivos con diferentes sufijos en varias subcarpetas.

Mi flujo de trabajo de Automator funciona de la siguiente manera:

  1. Solicitar elementos del buscador
  2. Obtener el contenido de la carpeta (opción de subcarpeta marcada)
  3. Filtrar elementos del buscador (para un sufijo de archivo específico)
  4. Copiar elementos del buscador

Esto funciona como un encanto. Pero todos los archivos se copian en la misma carpeta raíz de destino. Necesito mantener la estructura de la subcarpeta. Por ejemplo:

sourceFolder
    subfolderA
        fileA.jpg
        fileB.xls
        fileC.xls
    subfolderB
        fileC.jpg
        fileD.xls
        fileE.xls

Resultado esperado (filtro para el sufijo de archivo .xls):

destinationFolder
    subfolderA
        fileB.xls
        fileC.xls
    subfolderB
        fileD.xls
        fileE.xls

resultado actual:

destinationFolder
    fileB.xls
    fileC.xls
    fileD.xls
    fileE.xls

Actualizar

Soy un desarrollador. Por lo tanto, también se aceptará un shell o AppleScript. :)

Respuestas (3)

rsync -avh --include='*/' --include='*.xls' --exclude='*' path/to/sourceFolder/ path/to/destinationFolder

Tenga en cuenta que /al final de la ruta de origen, es importante . Esta solución agregaría todos los directorios vacíos, si no los quiere, mire la opción --prune-empty-dirs.

Con la expansión de llaves, en realidad puede incluir más tipos de archivo a la vez, en lugar de tener

--include='*.xls' --include='*.pdf' --include='*.txt'

puedes usar

--include='*.'{xls,pdf,txt}
excelente. ty! Probaré y volveré a ello.
Puede agregar todas las opciones que desee, la parte importante son las inclusiones y exclusiones: incluya todos los directorios (necesarios para la recursividad) y todos los .xlsarchivos, luego excluya todo lo demás. Si quieres más cosas como --deleteagregarlas a tu comando.

Termino con un script de shell, que funciona según lo solicitado:

$ find ./sourceFolder -name "*.xls*" -type f -print0 | xargs -0 -I '{}' /usr/bin/rsync -avR "{}" "./destinationFolder/"
rsync -avh --include='*/' --include='*.xls' --exclude='*' sourceFolder/ destinationFolder? Con la expansión de llaves, puede incluir más tipos de archivo --include='*.'{xls,pdf,txt}.
@Manuel Ty! ¿Alguna ventaja/desventaja de su solución?
Que no concatenes a través de tuberías, solo llamas rsyncuna vez con las banderas apropiadas.

En un script de shell, puede usar mkbom para crear un archivo BOM (lista de materiales) que contenga una lista de archivos que desea copiar. Luego puede usar el comando ditto con la opción --bom para copiar solo los archivos enumerados en el archivo BOM.

ty! ¿Alguna ventaja/desventaja de su solución?