5 votos

Copiar archivos específicos y mantener la estructura de subcarpetas

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

El flujo de trabajo de mi autómata funciona de la siguiente manera:

  1. Pregunte por los artículos del buscador
  2. Obtener el contenido de la carpeta (opción de subcarpeta marcada)
  3. Elementos del buscador de filtros (para un sufijo de archivo específico)
  4. Copiar los elementos del buscador

Esto funciona como un encanto. Pero todos los archivos se copian en la misma carpeta de destino de Root. Necesito mantener la estructura de subcarpetas. 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

Actualización

Soy un desarrollador. Así que también se aceptará una cáscara o un AppleScript. :)

8voto

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

Note el / al final del camino de la fuente, es importante . Esta solución añadiría todos los directorios vacíos, si no los quieres, mira la opción --prune-empty-dirs .

Con la expansión de la ortesis puedes incluir más tipos de archivos a la vez, en lugar de tener

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

puedes usar

--include='*.'{xls,pdf,txt}

0 votos

Genial. ¡Ty! Probaré y volveré a hacerlo.

0 votos

Puedes añadir todas las opciones que quieras, lo importante son los includes-excludes: incluir todos los directorios (necesario para la recursividad) y todos los .xls archivos, y luego excluir todo lo demás. Si quieres más cosas como --delete añádelos a tu comando.

1voto

Tino Rüb Puntos 18

Termino con una concha script, que funciona como se solicita:

$ find ./sourceFolder -name "*.xls*" -type f -print0 | xargs -0 -I '{}' /usr/bin/rsync -avR "{}" "./destinationFolder/"

0 votos

rsync -avh --include='*/' --include='*.xls' --exclude='*' sourceFolder/ destinationFolder ? Con la ampliación de los corchetes puedes incluir más tipos de archivos --include='*.'{xls,pdf,txt} .

0 votos

¡@Manuel ty! ¿Alguna ventaja/desventaja de tu solución?

0 votos

Que no se concatena a través de tuberías, sólo se llama a rsync una vez con las banderas adecuadas.

0voto

iWill Puntos 171

En un shell script puedes usar mkbom para hacer un archivo BOM (bill of materials) que contiene una lista de archivos que quieres copiar. Luego puedes usar el comando ditto con la opción --bom para copiar sólo los archivos que aparecen en el archivo de la lista de materiales.

0 votos

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X