Batchdatei zum Kopieren von Dateien, wobei die Originale in einem anderen Ordner bleiben

Batchdatei zum Kopieren von Dateien, wobei die Originale in einem anderen Ordner bleiben

Ich habe zum Beispiel einen Ordner:

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

Und ich habe eine andere Struktur

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

Namen der Ordner F11- F21, F12und F22sind gleich.

In Ordnern F21befinden F22sich weniger Dateien als in F11, F12.

Ich muss rekursiv kopieren F2, F1aber die Dateien, die ersetzt werden, sollten in einem Sicherungsordner gespeichert werden:

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

Dies ist erforderlich, um die Aktion „Rückgängig machen“ dieser Kopie durchführen zu können. Ich habe beispielsweise rekursiv kopiert F2, F1dann kopiere ich Fbackup nach F1und habe das Original F1.

Antwort1

Wenn Sie offen für die Verwendung einer Unix-Shell sind, finden Sie hier einige Alternativen bashoder meine eigene C-Shell.

C-Shell-Lösung

So können Sie es machen mitHamilton C-Schale, einschließlich derFreie Version:

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

Die ...Notation ist eineunbestimmter Verzeichnis-Platzhalterdas auf null oder mehr Verzeichnisebenen zutrifft, was auch immer nötig ist, damit der Rest des Musters übereinstimmt. ...\*trifft auf jede Datei oder jedes Verzeichnis im F2Verzeichnisbaum zu. Das-eOperatorTests auf Existenz und der -fOperator Tests auf Dateien.

Dieses Codefragment geht davon aus, dass keine versteckten Dateien oder Verzeichnisse vorhanden sind. Es wird auch davon ausgegangen, dass jedes Verzeichnis in F2(wenn auch nicht jede Datei) bereits in F1und vorhanden ist Fbackup.

Wenn versteckte Dateien und fehlende Verzeichnisse berücksichtigt werden müssen, besteht die Lösung darin, nonohidden = 1Undmkdiralle fehlenden Verzeichnisse:

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

bashLösung

Wenn Sie es vorziehenCygwin bashmüssen Sie findanstelle des ...Platzhalters verwenden, um das F2Verzeichnis zu durchsuchen. So könnte diese Lösung aussehen. (Ich bin kein bashExperte, daher ist es vielleicht möglich, dies zu verbessern.)

Erstellen Sie zunächst ein Skript und nennen Sie es 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

Führen Sie dann Folgendes aus:

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

verwandte Informationen