Intereting Posts
Изменение свойств X-объекта Zombie из состояния Iconic в нормальное состояние Как найти зависимости, требуемые пакетами RPM почему не работает pwd и echo? Выполнение команды для каждого файла в папке в случайном порядке Какие комбинации графических процессоров NVidia хорошо поддерживаются драйвером 319.82? Как сделать резервную копию нераспространяемых частей моей системы (а не только всего)? Установка RHEL для многократной загрузки с Windows и двумя другими дистрибутивами Linux Кросс-компилируемый модуль ядра Linux использование команды cat для копирования содержимого файла во все файлы в каталоге (рекурсивно) Файл server.js редактируется (от root с nano 2.4.2, PID xxxx); Продолжать? Установите фиксированную громкость звука на внешнюю звуковую карту USB Переустановка Ubuntu через двойной загрузочный ноутбук Как использовать Google DNS с ppp Программное изменение частоты процессора Как вырезать дату / временную метку String?

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

У вас есть три папки:

  • текущая папка, которая содержит ваши текущие файлы
  • папка old , которая содержит более старую версию тех же файлов
  • разница в папках, которая представляет собой просто пустую папку

Как вы сравниваете старые с текущими и копируете файлы, которые отличаются (или совершенно новыми) в текущих различиях ?


Я искал все вокруг, и это похоже на простую вещь, но я не могу заставить ее работать в моем конкретном примере. Большинство источников предложили использовать rsync, поэтому я получил следующую команду:

rsync -ac --compare-dest=../old/ new/ difference/ 

Тем не менее, это то, что копирует все файлы с нового на разницу , даже те, которые являются такими же, как и в старых .

В случае, если это помогает (возможно, команда в порядке, а ошибка лежит в другом месте), вот как я протестировал это:

  1. Я сделал три папки.
  2. Я сделал несколько текстовых файлов с различным содержанием в старых .
  3. Я скопировал файлы со старого на новый .
  4. Я изменил содержимое некоторых файлов в новом и добавил несколько дополнительных файлов.
  5. Я выполнил указанную выше команду и проверил результаты в разнице .

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

Я не уверен, что вы можете сделать это с любыми существующими командами linux, такими как rsync или diff. Но в моем случае мне пришлось написать свой собственный скрипт с использованием 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() - #!/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() 

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

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

 rsync -rvcm --compare-dest=../old/ new/ difference/ 

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

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

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

История: версия 1.14 – более эффективная, когда сравнивается много десятков тысяч файлов.

Метод rsync, данный Thane с дополнениями Yamaneko, отлично работает, но оставляет пустые каталоги. Для меня окончательное решение было в два этапа: сначала вызовите rsync с полным путем, затем команду find, чтобы удалить все пустые каталоги:

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

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

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

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

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

Таким образом, я выполнил поиск в mbs-files в старой корневой mailfolder (на одной панели), а также в самой новой (в другой панели) и сделал сравнение результатов поиска на каждой панели ( Sync Select Unique , чтобы найти письма который пропал во время переустановки)! Вы также можете установить множество опций.