arquivo em lote para copiar arquivos mantendo os originais em outra pasta

arquivo em lote para copiar arquivos mantendo os originais em outra pasta

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- F21e F12são F22iguais.

Nas pastas F21, F22há menos arquivos do que em F11, F12.

Preciso copiar F2recursivamente 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 F2recursivamente F1, depois copiei Fbackup F1e tenho o arquivo original F1.

Responder1

Se você estiver disposto a usar um shell Unix, aqui estão algumas alternativas usando bashmeu 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-eoperadortesta a existência e o -foperador 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 F1e Fbackup.

Se for necessário considerar arquivos ocultos e diretórios ausentes, a solução seria definir nonohidden = 1emkdirquaisquer 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

bashsolução

Se você preferirCygwin bash, você precisará usar findno lugar do ...curinga para percorrer a árvore no F2diretório. Esta é a aparência dessa solução. (Não sou bashespecialista, 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 {}"

informação relacionada