arquivo em lote para copiar arquivos mantendo originais em outra pasta

1

Por exemplo, eu tenho 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 , F12 e F22 são iguais.

Nas pastas F21 , F22 , há menos arquivos que em F11 , F12 .

Eu preciso copiar F2 para F1 recursivamente, mas 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 que seja possível "desfazer" a ação dessa cópia. Por exemplo, copiei F2 em F1 recursivamente, depois copiei Fbackup para F1 e tenho original F1 .

    
por Larry Cinnabar 28.02.2013 / 07:07

1 resposta

0

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 {}"
    
por 28.02.2013 / 23:41