Например у меня есть папка:
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 {}"