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
, F12
und F22
sind gleich.
In Ordnern F21
befinden F22
sich weniger Dateien als in F11
, F12
.
Ich muss rekursiv kopieren F2
, F1
aber 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
, F1
dann kopiere ich Fbackup nach F1
und habe das Original F1
.
Antwort1
Wenn Sie offen für die Verwendung einer Unix-Shell sind, finden Sie hier einige Alternativen bash
oder 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 F2
Verzeichnisbaum zu. Das-e
OperatorTests auf Existenz und der -f
Operator 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 F1
und vorhanden ist Fbackup
.
Wenn versteckte Dateien und fehlende Verzeichnisse berücksichtigt werden müssen, besteht die Lösung darin,
nonohidden = 1
Undmkdir
alle 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
bash
Lösung
Wenn Sie es vorziehenCygwin bash
müssen Sie find
anstelle des ...
Platzhalters verwenden, um das F2
Verzeichnis zu durchsuchen. So könnte diese Lösung aussehen. (Ich bin kein bash
Experte, 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 {}"