Se você está aberto para usar um shell Unix, aqui estão algumas alternativas usando bash
ou meu próprio shell C.
Solução de shell C
Veja como você pode fazer isso com Shell Hamilton C , incluindo o free version :
cd F2
foreach i (...\*)
if ( -f $i ) then
if ( -e F1\$i ) cp F1\$i Fbackup\$i
cp $i F1\$i
end
end
A notação ...
é um curinga de diretório indefinido que corresponde a zero ou mais níveis de diretório, o que for preciso para fazer o resto do padrão corresponder. ...\*
corresponde a todos os arquivos ou diretórios na árvore de diretórios F2
. O operador -e
testa a existência e o operador -f
testa os arquivos.
Este fragmento de código assume que não há arquivos ocultos ou diretórios de interesse. Ele também assume que todos os diretórios em F2
(mesmo que não todos os arquivos) já existam em F1
e Fbackup
.
Se arquivos ocultos e diretórios ausentes precisarem ser considerados, a solução seria definir
nonohidden = 1
e mkdir
qualquer diretório ausente:
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
solution
Se preferir Cygwin bash
, você precisará usar find
em vez do curinga ...
para percorrer o% diretórioF2
. Veja como essa solução pode parecer. (Eu não sou um especialista em bash
, então talvez seja possível melhorar isso.)
Primeiro, crie um script, chame-o de 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
Em seguida, execute da seguinte forma:
cd F2
find . -type f | xargs -I "{}" bash -c "backupscript.sh {}"