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