rsync сравнивают каталоги?

Так как Вы не упоминаете, я предполагаю, что это находится на Linux.

dmidecode -t memory
dmidecode -t 16
lshw -class memory
66
01.12.2012, 13:18
5 ответов

Необходимо будет propably выполнить что-то как rsync -avun --delete в обоих направлениях.

Но что Вы на самом деле пытаетесь выполнить?

Обновление:

rsync -avun --delete $TARGET $SOURCE |grep "^deleting " даст Вам список файлов, которые не существуют в целевом каталоге.

"grep удаляют", потому что каждая строка печатает: удаление.. файл..

rsync -avun $SOURCE $TARGET даст Вам список "различных" файлов (включая новые файлы).

46
27.01.2020, 19:31

Для добавления в ответ Нильса (для всех, кто сталкивается с этим через Google), по умолчанию rsync сравнивает только размеры файлов и время модификации, чтобы определить, есть ли какие-то различия. (Если они отличаются, это делает больше, но если они одинаковы, то на этом всё.)

Если вы хотите сравнить фактический размер файла , даже для файлов, которые имеют одинаковый размер и время последней модификации, добавьте флаг -c, чтобы сказать rsync, чтобы сравнить файлы с помощью контрольной суммы.

rsync -avnc $SOURCE $TARGET

(Опция -u говорит rsync игнорировать файлы, которые являются более новыми в $TARGET, чем на $SOURCE, которые вы, вероятно, не хотите, если вы сравниваете содержимое.)

.
51
27.01.2020, 19:31

Для тех, кто менее знаком с rsync :

rsync -rvnc --delete ${SOURCE}/ ${DEST}
  • -n : самый важный бит - сделать не ничего менять;
  • -rc : сравнивать только содержимое (в противном случае используйте -ac );
  • -v : список файлов)
  • - -delete : ищите симметричную, а не однонаправленную разницу.
  • Наконец, / означает «заглянуть внутрь каталога и сравнить его содержимое с местом назначения».

Будет напечатан обычный rsync вывод,

  • с одним в строке для каждого «нового» файла в $ {SOURCE}
  • и одна строка «удаление <имя файла>» для каждого «нового» файла в $ {DEST} .

  • Он также может выводить несколько предупреждений, например «пропуск нестандартного файла <имя файла>» для символических ссылок.

PS. Я знаю, что это ужасный PS, но он действительно был добавлен в спешке. Тем не менее, держу пари, это может оказаться полезным.


PPS. В качестве альтернативы можно также выполнить
find $SOURCE -type f -exec md5sum {} \; | tee source.md5
find $DEST   -type f -exec md5sum {} \; | tee dest.md5

Если имена файлов не содержат символов новой строки, мы можем отсортировать файлы *. Md5 и diff ] их. (Это будет работать только для файлов; то есть пустой каталог с обеих сторон не будет обнаружен.)

27
27.01.2020, 19:31

Из вашего вопроса я понял, что вы не хотите использовать diff на ls, но вы также можете рекурсивно использовать diff для каталогов:

diff -rq DIR1 DIR2
13
27.01.2020, 19:31

Me tomó algunos intentos hacer que esto funcionara. La respuesta de Nils requiere que $TARGETtermine en /final, como lo explica ジョージ.

Aquí hay una versión que agrega explícitamente el final/:

rsync -avun --delete ${TARGET}/ ${SOURCE}  | sed -ne 's/^deleting *//p'

Esto proporciona la lista de archivos que existen debajo del directorio ${SOURCE}pero no debajo del directorio ${TARGET}.

Uso sedaquí para eliminar el deletinginicial de las líneas de salida y para imprimir solo esas líneas.

No uso la opción rsync-cporque comparar el contenido de los archivos sería mucho más lento para mis casos de uso, y comparar solo los tamaños de los archivos y los tiempos de modificación también parece suficiente en estos casos. No tengo ninguna razón para sospechar que mis computadoras sufren problemas de sesgo de reloj o que algo maliciosamente cambió las marcas de tiempo. También,el resultado de -cno puede cambiar la decisión de eliminar un archivo, solo la decisión de actualizar o mantener un archivo.

También uso -uy-a(en lugar de -r), para poder volver a -usar la línea de comando y cambiarla para copiar directorios y archivos seleccionados de ${SOURCE}a ${TARGET}, así:

rsync -avu ${SOURCE}/{dirA,dirB,fileX} ${TARGET}   # copy some files
2
27.01.2020, 19:31

Теги

Похожие вопросы