¿Copia de archivo recursiva que no sobrescribe?

21

Tengo un directorio que contiene un montón de otras carpetas que contienen archivos CoffeeScript / JavaScript. Puedo compilar los archivos CoffeeScript en una nueva carpeta con la misma estructura de carpetas bien.

Lo que quiero hacer es copiar todos los archivos * .js en la carpeta de origen a la carpeta de destino de forma recursiva. Tampoco quiero sobrescribir ningún archivo que ya esté presente en la carpeta de destino. ¿Alguna idea de cómo lograr esto?

Intenté usar cp -n source/**.js desination/y cp -Rn source/**.js desination/después de mirar otra pregunta similar, pero no parece estar funcionando.

¿Alguna idea de cómo lograr esto?

AlbertEngelB
fuente
¿Has echado un vistazo a rsync?
bonob
@bonob no tengo no. Lo he usado una o dos veces, pero solo para obtener archivos de forma remota.
AlbertEngelB

Respuestas:

25

Puede usar rsync (también hace copia local)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r recurrir a directorios,
  • --ignore-existing para ignorar los archivos existentes en el destino,
  • los filtros includey excludesignifican: incluir todos los directorios, incluir todos los archivos * .js, excluir el resto; se necesita la primera inclusión; de lo contrario, la exclusión final también excluirá los directorios antes de escanear su contenido.

Finalmente, puede agregar un -Psi desea ver el progreso, un --list-onlysi desea ver qué copiaría sin copiar realmente y un -tsi desea conservar las marcas de tiempo.


Esto no está relacionado, pero aprendí el comando rsync recientemente, cuando moví 15 años de documentos de una partición a otra. Confiando en que mis archivos estaban allí, limpié la vieja partición y puse algunas otras cosas allí; Más tarde me di cuenta de que perdí todas las marcas de tiempo y descubrí la bandera -t. Solo quería compartir mi angustia: '(

bonob
fuente
Jaja, este funcionó! rsyncAl parecer es la bomba.
AlbertEngelB
3
Sí, apenas lo sé, pero aprendí mucho al tratar de responder a tu pregunta. Si necesita ir más lejos en el futuro, puede definir filtros complejos en archivos y llamarlos en el comando, por ejemplo. También puede tener filtros por directorio, comprimir datos al copiar, ¡y eso es solo arañar la superficie!
bonob
7

Esto también se puede lograr con cp. Mira aquí:

sudo cp -vnpr /xxx/* /yyy

xxx = fuente

aaa = destino

v = detallado

n = sin clobber (sin sobrescribir)

p = preservar permisos

r = recursivo

SEMbyotic
fuente
5

Mirando las páginas man parece que quieres la -nopción.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
tantalio
fuente
He intentado usar -n, sin embargo, no me permite filtrar por archivos * .js.
AlbertEngelB
0

Mi distribución no tenía clobber disponible, así que:

echo n | cp -vipr xxx yyy

xxx = fuente

aaa = destino

v = detallado

i = interactivo (solicitud para sobrescribir) | por eso el comando va precedido de "echo n |"

p = preservar permisos

r = recursivo

Octavio
fuente