Por exemplo, tenho uma pasta:
F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..
E eu tenho outra estrutura
F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...
nomes de pastas F11
- F21
e F12
são F22
iguais.
Nas pastas F21
, F22
há menos arquivos do que em F11
, F12
.
Preciso copiar F2
recursivamente F1
, mas os arquivos que serão substituídos - devem ser salvos em uma pasta de backup:
Fbackup\F11\those files..
Fbackup\F12\those files..
Isso é necessário para poder executar a ação "desfazer" dessa cópia. Por exemplo, copiei F2
recursivamente F1
, depois copiei Fbackup F1
e tenho o arquivo original F1
.
Responder1
Se você estiver disposto a usar um shell Unix, aqui estão algumas alternativas usando bash
meu próprio shell C.
Solução de shell C
Veja como você pode fazer isso comConcha Hamilton C, incluindo oversão gratuita:
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 é umacuringa de diretório indefinidoque corresponda a zero ou mais níveis de diretório, o que for necessário para fazer com que o restante do padrão corresponda. ...\*
corresponde a cada arquivo ou diretório na F2
árvore de diretórios. O-e
operadortesta a existência e o -f
operador testa os arquivos.
Este fragmento de código pressupõe que não há arquivos ou diretórios ocultos preocupantes. Ele também pressupõe que todos os diretórios F2
(mesmo que nem todos os arquivos) já existam em F1
e Fbackup
.
Se for necessário considerar arquivos ocultos e diretórios ausentes, a solução seria definir
nonohidden = 1
emkdir
quaisquer diretórios ausentes:
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
solução
Se você preferirCygwin bash
, você precisará usar find
no lugar do ...
curinga para percorrer a árvore no F2
diretório. Esta é a aparência dessa solução. (Não sou bash
especialista, então talvez seja possível melhorar isso.)
Primeiro, crie um script, chame-o 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 maneira:
cd F2
find . -type f | xargs -I "{}" bash -c "backupscript.sh {}"