Ejecutando ubuntu 12.04, quiero comparar 2 directorios, digamos carpeta1 / y carpeta2 / y copiar cualquier archivo que sea diferente a la carpeta3 /. También hay archivos anidados, por lo que también se deben copiar subdirectorios coincidentes
¿Hay un solo comando que me ayudaría? Puedo obtener la lista completa de archivos modificados en ejecución:
rsync -rcnC --out-format="%f" folder1/ folder2/
Pero rsync no parece tener la capacidad de "exportar" estos archivos en un directorio de destino diferente. ¿Puedo canalizar la lista a cp o algún otro programa, para que los archivos se copien, mientras que también se crean los directorios? Por ejemplo, intenté
rsync -rcnC --out-format="%f" folder1/ folder2/ | xargs cp -t folder3/
pero eso no preservaría los directorios también, simplemente copiaría todos los archivos dentro de la carpeta3 /
diff -qr
yawk
para construir la lista, entoncesrsync
...rsync --include-from=FILE
opción.Respuestas:
Utilice --compare-dest.
Desde la página del manual:
primero verifique su sintaxis con --dry-run
Luego, una vez que esté satisfecho con la salida:
este enlace tiene una buena explicación de --compare-dest scope.
fuente
rsync -rcC --compare-dest=folder2/ folder1/ folder3/
rsync version 3.1.1 protocol version 31
en mi local y rsync no entiende~/
rutas para--compare-dest
param.--compare-dest
requería un camino absoluto.fonts/Makefile.in
archivo, que es idéntico en ambosfolder2
y en losfolder1
directorios.Este pequeño script debería funcionar:
Pero también creo que analizar la salida de diff -qr sería una mejor solución porque te da la ruta y el nombre de cada archivo de manera consistente.
EDITAR
Este sería un comando, su comando ligeramente modificado. Pero creará
folder1
bajo elfolder3
. Y no funciona con rutas completas, pero tampoco el script anterior funciona con rutas completas.He utilizado
\"
enrsync
hacer que funcione con archivos y directorios que contiene espacios en blanco. Probado en Ubuntu 10.04. Espero eso ayude.fuente
Esa es la forma más simple que se me ocurre, si estás dispuesto a descender
folder1
antes de emitir el comando.Esta es la opción más lenta , pero creo que cumple con sus requisitos, y podría ejecutarse utilizando nombres de directorio no relativos:
Dejé
rsync
solo tu comando original , porque dijiste que te estaba dando la lista de archivos correcta (y mis archivos de prueba son obviamente diferentes a los tuyos, por lo que no podría decir con certeza que obtendría la lista de archivos correcta si me equivocara con eso).El
grep
está allí para eliminar los nombres de directorio de la salida dersync
.La salida de
grep
se canaliza a otrarsync
usandoxargs
. En el parámetro,folder1/./{}
el extra./
se usa para indicarle a rsync que cree los directorios relativos comenzando por./{}
, ignorandofolder1/
. En otras palabras, evita crearfolder3/folder1/
.Solo pude probar esto en CentOS 6.4, pero AFAIK debería funcionar igual en Ubuntu 12.04.
EDITAR: Debo señalar que la respuesta de Smith es indudablemente mejor, pero quería intentar hacerlo con tu
rsync
comando original en el tacto ya que te estaba dando el resultado deseado.fuente