archivo por lotes para copiar archivos manteniendo los originales en otra carpeta

archivo por lotes para copiar archivos manteniendo los originales en otra carpeta

Por ejemplo tengo la carpeta:

F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..

Y tengo otra estructura

F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...

nombres de carpetas F11- F21y F12son F22iguales.

En las carpetas F21hay F22menos archivos que en F11.F12

Necesito copiar F2de F1forma recursiva, pero los archivos que serán reemplazados deben guardarse en una carpeta de respaldo:

Fbackup\F11\those files..
Fbackup\F12\those files..

Esto es necesario para poder realizar la acción "deshacer" de esa copia. Por ejemplo, he copiado F2de F1forma recursiva, luego copio Fbackup F1y tengo el archivo original F1.

Respuesta1

Si está dispuesto a utilizar un shell Unix, aquí hay un par de alternativas que utilizan bashmi propio shell C.

solución de cáscara C

Así es como puedes hacerlo conCarcasa Hamilton C, incluyendo elversión gratuita:

cd F2
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) cp F1\$i Fbackup\$i
      cp $i F1\$i
   end
end

La ...notación es unacomodín de directorio indefinidoque coincida con cero o más niveles de directorio, lo que sea necesario para que el resto del patrón coincida. ...\*coincide con cada archivo o directorio en el F2árbol de directorios. El-eoperadorpruebas de existencia y el -foperador pruebas de archivos.

Este fragmento de código supone que no hay archivos ni directorios ocultos que sean motivo de preocupación. También supone que todos los directorios F2(aunque no todos los archivos) ya existen en F1y Fbackup.

Si es necesario considerar archivos ocultos y directorios faltantes, la solución sería configurar nonohidden = 1ymkdircualquier directorio que falte:

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

bashsolución

Si tu prefieresCygwin bash, deberá utilizarlo finden lugar del ...comodín para recorrer el F2directorio. Así es como podría verse esa solución. (No soy un bashexperto, por lo que es posible mejorar esto).

Primero, crea un script, llámalo 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

Luego ejecute de la siguiente manera:

cd F2
find . -type f  | xargs -I "{}" bash -c "backupscript.sh {}"

información relacionada