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


tl; dr и пример

Я ищу способ сравнить две папки рекурсивно и вывести относительные пути ко всем файлам (и папкам), которые отличаются (по размеру или по временной метке, à la rsync).

например, скажем, у меня есть

C:sourcefooa.txt
C:sourcefoobarb.txt
C:sourcefoobarc.txt

и

C:targetfooa.txt
C:targetfoobarb.txt
C:targetfoobard.txt
C:targetfoobaz

и предположим, что b.txt было изменено в C:source, и, таким образом, более новые.

затем дается магический скрипт или команда, скажем,magic C:source C:target, Я хотел был бы выход к будь

foobarb.txt

или полный путь к исходной или целевой папке также будет приемлем:

C:sourcefoobarb.txt

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

что я уже знаю...

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

чтение http://www.howtoforge.com/backing-up-with-rsync-and-managing-previous-versions-history, я узнал, что rsync может делать что-то вроде того, что мне нужно, используя параметры как

--dry-run               # don't actually rsync (touch) any files
--itemize-changes       # list changes rsync _would_ have made
--out-format="%i|%n|"   # define an output format for the list of changes

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

Я не нашел никакого "канонического" инструмента, такого как rsync в Windows, по крайней мере, не поддерживающего такие опции, как выше. Также,я не ищу программное обеспечение в общем, если это не простой и компактный инструмент специально для этой цели -я предпочитаю прозрачное, программируемое решение. Для чего-то столь же важного, как резервное копирование файлов, полагаться на программное обеспечение или код, который я не вижу или не понимаю, страшно!

резюме

Я не могу обернуть голову вокруг синтаксиса пакетных сценариев. Далее я попробую PowerShell. Но что бы вы да, дали это задание?- Есть ли какой-то очевидный маршрут, что я не хватает?

7
задан Community
27.03.2023 15:58 Количество просмотров материала 3551
Распечатать страницу

2 ответа

@Glytzhkof рекомендовал Robocopy в своем ответе, и он идеально соответствовал моим потребностям.

tl; dr

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs

                                C:\source\foo\bar\b.txt

детали и объяснение опций

Robocopy (Wikipedia) кажется широко распространенным для системного администрирования Windows; is хорошо документированы (TechNet); обсуждается как нечто большее, чем неизвестность на Переполнение Стека,Ошибка Сервера и конечно, здесь, в Супер Пользователя; обеспечивает конкретную функцию, а не пытается быть многоцелевым инструментом (который, как правило, раздувается и ошибок); и, кроме того, предоставляет эту конкретную функцию с 1997 года. Для меня все эти факторы способствуют "прозрачности", несмотря на то, что это закрытый источник, и заставляют меня думать спокойно.

Robocopy входит в набор инструментов, известных в настоящее время как Windows Server 2003 Resource Kit Tools. После загрузки и установки, Я воссоздал сценарий в своем вопросе и дал ему идти:

C:\>robocopy.exe source target /l /e /zb

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

  Started : Thu May 01 09:08:20 2014

   Source : C:\source\
     Dest : C:\target\

    Files : *.*

  Options : *.* /L /S /E /COPY:DAT /ZB /R:1000000 /W:30

------------------------------------------------------------------------------

                           0    C:\source\
                           1    C:\source\foo\
        *EXTRA Dir        -1    C:\target\foo\baz\
                           2    C:\source\foo\bar\
          *EXTRA File                  1        d.txt
            Newer                      5        b.txt
            New File                   1        c.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         3         0         3         0         0         1
   Files :         3         2         1         0         0         1
   Bytes :         7         6         1         0         0         1
   Times :   0:00:00   0:00:00                       0:00:00   0:00:00

   Ended : Thu May 01 09:08:20 2014

выглядит хорошо! Поясню варианты:

  • /l действия списков без собственно проведение их.
  • /e включает в себя подкаталоги, но в отличие от /s тоже содержит пустые каталоги.
  • /zb копирует в "перезагрузите" режим, и на "доступ запрещен", "резервный режим"; похоже, самый безопасный подход; подробнее здесь.

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

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

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs

                                C:\source\foo\bar\b.txt

опять же, давайте рассмотрим варианты.

во-первых, меня волновало только изменен файлы и папки, так:

  • /xx исключает "лишние" файлы и каталоги-те которые существуют только в цели.
  • /xl исключает "одиночные" файлы и каталоги-те, которые существуют только в исходном коде.

во-вторых, я желал относительные пути (или по крайней мере полные пути, а не только имена):

  • /fp включает полные пути (неудивительно, что не было никакой возможности для относительных путей).

в-третьих, я хотел удалить как можно больше лесозаготовительного пуха, и я был приятно удивлен, обнаружив, что all из него был съемный:

  • /ns подавляет размеров файла.
  • /nc подавляет классов, например Newer.
  • /ndl подавляет имена каталогов.
  • /np подавляет вывод хода выполнения копирования.
  • /njh подавляет заголовок задания.
  • /njs подавляет резюме работу.

и там у вас есть это!


для моих целей (создание версионных резервных копий измененных файлов) я понял, что на самом деле хотел бы иметь временную метку каждого измененного файла. Просто добавьте /ts:

C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs /ts

                         2014/05/01 15:20:42    C:\source\foo\bar\b.txt
4
отвечен Andrew Cheong 2023-03-28 23:46

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

лучший дешевый инструмент для коммерческого сравнения Beyond Compare от http://www.scootersoftware.com/ - это руки вниз с гениального инструмента. Своя польза немедленна и инструмент все профессионалы, работающие с файлами выиграют от каждого дня. попробуй. посмотреть скриншот. есть версия командной строки включены.

кроме этого Robocopy.exe должен быть в состоянии выполнить то, что вы хотите с некоторым терпением и тестирования.

другой совет: чтобы избежать аварии резервного копирования я запустил сценарий резервного копирования с низким уровнем привилегий учетной записи, чтобы предотвратить его от удаления ничего, если кто-то будет возиться со сценарием, или иметь какие-либо права на всех, если кто-то пытается войти в систему с ним. Я думаю, что я установил учетную запись неинтерактивной или не смог войти в интерактивном режиме или что-то еще. Очень рекомендую для пакетной работы в Windows. Просто подумал, что упомяну об этом, раз уж вы пришли из мира Unix.

2
отвечен Stein Åsmul 2023-03-29 02:03

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

diff
file-comparison
file-management
rsync
windows-7-backup
Вверх