1

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

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 ответ1

0

Если вы открыты для использования оболочки 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 {}"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .