пакетный файл для копирования файлов с сохранением оригиналов в другой папке

пакетный файл для копирования файлов с сохранением оригиналов в другой папке

Например у меня есть папка:

F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..

И у меня другая структура.

F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...

имена папок F11- F21, F12и F22равны.

В папках F21меньше F22файлов, чем в F11, F12.

Мне нужно копировать F2рекурсивно F1, но файлы, которые будут заменены, следует сохранить в резервной папке:

Fbackup\F11\those files..
Fbackup\F12\those files..

Это необходимо для возможности "отменить" действие этой копии. Например, я скопировал F2рекурсивно F1, затем скопировал Fbackup F1и у меня есть оригинальный F1.

решение1

Если вы открыты для использования оболочки Unix, вот несколько альтернатив с использованием bashмоей собственной оболочки C.

Решение оболочки C

Вот как вы можете это сделать с помощьюКорпус Hamilton C, в том числебесплатная версия:

cd F2
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) cp F1\$i Fbackup\$i
      cp $i F1\$i
   end
end

Обозначение ...представляет собойнеопределенный подстановочный знак каталогакоторый соответствует нулю или более уровням каталогов, что бы ни потребовалось, чтобы остальная часть шаблона совпала. ...\*соответствует каждому файлу или каталогу в F2дереве каталогов.-eоператорпроверяет существование, а -fоператор проверяет наличие файлов.

Этот фрагмент кода предполагает, что нет никаких скрытых файлов или каталогов, вызывающих беспокойство. Он также предполагает, что каждый каталог в F2(даже если не каждый файл) уже существует в F1и Fbackup.

Если необходимо учитывать скрытые файлы и отсутствующие каталоги, решением будет установить nonohidden = 1иmkdirлюбые отсутствующие каталоги:

cd F2
@ nonohidden = 1
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) then
         if ( ! -e Fbackup\$i:h ) mkdir -r Fbackup\$i:h
         cp F1\$i Fbackup\$i
      end
      if ( ! -e F1\$i:h ) mkdir -r F1\$i:h
      cp $i F1\$i
   end
end

bashрешение

Если вы предпочитаетеCygwin bash, вам нужно будет использовать findвместо ...подстановочного знака для обхода дерева F2каталога. Вот как может выглядеть это решение. (Я не bashэксперт, поэтому, возможно, это можно улучшить.)

Сначала создайте скрипт, назовите его backupscript.sh:

#!/usr/bin/bash
if [ -f "$@" ]; then
   if [ -e F1/"$@" ]; then
      cp F1/"$@" Fbackup/"$@"
   fi
   head=$(dirname "$@")
   if [ ! -e F1/"$head" ]; then
      mkdir -p F1/"$head"
   fi
   cp "$@" F1/"$@"
end

Затем выполните следующее:

cd F2
find . -type f  | xargs -I "{}" bash -c "backupscript.sh {}"

Связанный контент