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
- F21
y F12
son F22
iguales.
En las carpetas F21
hay F22
menos archivos que en F11
.F12
Necesito copiar F2
de F1
forma 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 F2
de F1
forma recursiva, luego copio Fbackup F1
y tengo el archivo original F1
.
Respuesta1
Si está dispuesto a utilizar un shell Unix, aquí hay un par de alternativas que utilizan bash
mi 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-e
operadorpruebas de existencia y el -f
operador 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 F1
y Fbackup
.
Si es necesario considerar archivos ocultos y directorios faltantes, la solución sería configurar
nonohidden = 1
ymkdir
cualquier 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
bash
solución
Si tu prefieresCygwin bash
, deberá utilizarlo find
en lugar del ...
comodín para recorrer el F2
directorio. Así es como podría verse esa solución. (No soy un bash
experto, 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 {}"