Как Вы сравниваете две папки и копируете различие в третью папку?

Это действительно помогает: http://iso2usb.sourceforge.net/

Утилита ISO2USB создает загрузочную Карту памяти из установочного диска CentOS/RedHat 5.x/6.x или соответствующего ISO-образа. Созданная Карта памяти может использоваться для выполнения установки на машинах тот оптический диск отсутствия. Диски пользовательской установки (с запускают конфигурационные файлы) полностью поддерживаются.

Исходный код ISO2USB основан на проекте UNetbootin, но показывает следующие различия:

  • Созданная Карта памяти является полностью автономной и не полагается на сетевую установку.
  • Диски пользовательской установки полностью поддерживаются (запустите конфигурационные файлы, адаптированы к режиму установки USB).
  • Исходные оптические среды (CD или DVD) могут использоваться вместо ISO-образов.
  • Изображение может быть адаптировано к установке от последовательной консоли RS-232.

23
08.12.2013, 13:36
5 ответов

Я не уверен, можно ли сделать это с какими-либо существующими командами Linux, такими как rsync или различный. Но в моем случае я должен был записать свой собственный сценарий с помощью Python, поскольку Python имеет "filecmp" модуль для сравнения файлов. Я отправил целый сценарий и использование в моем персональном сайте - http://linuxfreelancer.com/

Оно использование просто - дает ему полный путь нового каталога, старого каталога и каталога различия в том порядке.

#!/usr/bin/env python

import os, sys
import filecmp
import re
from distutils import dir_util
import shutil
holderlist=[]

def compareme(dir1, dir2):
    dircomp=filecmp.dircmp(dir1,dir2)
    only_in_one=dircomp.left_only
    diff_in_one=dircomp.diff_files
    dirpath=os.path.abspath(dir1)
    [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in only_in_one]
    [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:
        for item in dircomp.common_dirs:
            compareme(os.path.abspath(os.path.join(dir1,item)), os.path.abspath(os.path.join(dir2,item)))
        return holderlist

def main():
 if len(sys.argv) > 3:
   dir1=sys.argv[1]
   dir2=sys.argv[2]
   dir3=sys.argv[3]
 else:
   print "Usage: ", sys.argv[0], "currentdir olddir difference"
   sys.exit(1)

 if not dir3.endswith('/'): dir3=dir3+'/'

 source_files=compareme(dir1,dir2)
 dir1=os.path.abspath(dir1)
 dir3=os.path.abspath(dir3)
 destination_files=[]
 new_dirs_create=[]
 for item in source_files:
   destination_files.append(re.sub(dir1, dir3, item) )
 for item in destination_files:
  new_dirs_create.append(os.path.split(item)[0])
 for mydir in set(new_dirs_create):
   if not os.path.exists(mydir): os.makedirs(mydir)
#copy pair
 copy_pair=zip(source_files,destination_files)
 for item in copy_pair:
   if os.path.isfile(item[0]):
    shutil.copyfile(item[0], item[1])

if __name__ == '__main__':
 main()
7
27.01.2020, 19:42

Я выяснил то, что проблема была в моем случае:

Файлы, которые я сравнивал, имели различные метки времени. Я не должен был использовать-a аргумент, я принимаю, потому что rsync пытался сохранить метки времени при копировании файлов. Команда, которая работала на меня, была:

rsync -rvcm --compare-dest=../old/ new/ difference/
21
27.01.2020, 19:42
  • 1
    , я думаю для тестирования этого с-a (архив) опция, необходимо было использовать rsync -a "скопировать" файлы первоначально (или эквивалентное CP), затем удаленный или измененный. (Мне нравится придерживаться rsync, потому что я знаю, что это последовательно, не думая о том, что это могло бы делать.) Я думаю, что это должно было работать с исходной командой.-a опция включает-t (сравните меткой времени), который является альтернативой-c (сравните контрольной суммой). –  sage 04.09.2014, 20:44
  • 2
    По-моему, этот ответ должен быть принятым тем, поскольку это намного более просто. Кроме того, команда только работала на меня, когда я обеспечил полный путь для old/ и new/. –  Yamaneko 03.11.2015, 20:05

Я использую dualpane XY (коммерческий) Проводник, который может сделать много приемов, и это - один из них. Открытый Current в одной области и Старый в другом. Активируйте область Current. Перейдите к Областям> Синхронизирующий Выбор. Это дает Вам 5 опций выбрать:

  1. Соответствия (перечисленный в обоих)
  2. Uniques (в активной области)
  3. Более новый (в активной области)
  4. Уникальные и Более новые файлы (в активной области)
  5. Выбранный (выбранные в другой области)

Теперь можно скопировать получающийся выбор с Current туда, где Вы хотите. Я использовал его для сравнения mailfolders от старых установок с последнее. Структура папок была довольно сложна, но (почти) все mbs-files имел уникальное число.

Таким образом, я сделал поиск на mbs-files в старом корне mailfolder (в одной области), а также на новейшем (в другой области) и сделал сравнение на результатах поиска в каждой области (Синхронизируйте Уникальный Выбор, для нахождения писем, которые пропали во время, переустанавливает)! Можно установить много опций также.

-3
27.01.2020, 19:42
  • 1
    Если Вы говорите о нестандартном программном обеспечении, необходимо включать ссылку. Если Вы имеете в виду XYplorer, который не собирается помогать OP вообще. –  Anthon 24.01.2014, 15:23

Это может помочь некоторым читателям: В Windows, старая, маленькая бесплатная программа -- Third Dir -- делает именно то, о чём здесь просят. Она больше не доступна через разработчика, Роберта Вашичека. Но я уверен, что её можно найти в некоторых репозиториях онлайн.

Вот описание разработчика, которое осталось на его сайте:

Третий каталог: необычный каталог-синхронизатор - различные файлы копируются в третий каталог. Очень полезно извлечь, например, новые или отредактированные фотографии из огромного дерева каталогов на фиксированном диске во временную папку, а затем добавить их в архивный CD (примечание - оригинальные файлы сравниваются с компакт-диском). Версия 1.4, размер 23 кБ. Создан в 2005-02-12 годах.

История: Версия 1.14 - более эффективна при сравнении многих десяти из тысяч файлов.

1
27.01.2020, 19:42

Способ rsync, предложенный Таном с дополнениями Яманеко, отлично работает, но оставляет пустые каталоги. Для меня окончательное решение состояло из двух шагов: сначала вызов rsync с полным путем, затем команда find для удаления всех пустых каталогов. :

rsync -rvcm --compare-dest=/tmp/org/ /tmp/new/ /tmp/difference/
find /tmp/difference/ -d -type d -empty -exec rmdir {} \; -print

Обратите внимание, что даже с параметром --links rsync не сохраняет символические ссылки, а вместо этого копирует данные назначения.

0
27.01.2020, 19:42

Теги

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