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