Beispiel
Angenommen, ich habe zwei Verzeichnisse a/
und b/
. Nehmen wir an, sie enthalten die folgenden Dateien:
a/
a/foo/1
a/bar/2
a/baz/3
b/
b/foo/1
b/bar/2
sodass a/foo/1
und b/foo/1
identisch sind, aber a/bar/2
und b/bar/2
unterschiedlich sind.
Nach dem Zusammenführen a/
mit b/
möchte ich Folgendes erhalten:
a/
a/bar/2
b/
b/foo/1
b/bar/2
b/baz/3
Erläuterung
a/foo/
undb/foo/
sind (rekursiv) identisch, also entfernen wira/foo/
.a/bar/2
undb/bar/2
sind unterschiedlich, also tun wir nichts.a/baz/
existiert nur in,a/
aber nicht inb/
, also verschieben wir es nachb/baz/
.
Gibt es dafür einen vorgefertigten Shell-Befehl? Ich habe das Gefühl, dass das rsync
funktionieren könnte, aber ich kenne mich damit nicht aus rsync
.
Antwort1
Ich kann nicht sagen, dass ich einen bestimmten Befehl kenne, der dies für Sie erledigen würde. Aber Sie könnten dies einfach durch Hashing erreichen.
Naives Beispiel unten:
#!/bin/bash
# ...some stuff to get the files...
# Get hashes for all source paths
for srcFile in "${srcFileList[@]}"
do
srcHashList+="$(md5sum "$srcFile")"
done
# Get hashes for all destination paths
for dstFile in "${dstFileList[@]}"
do
dstHashList+="$(md5sum "$dstFile")"
done
# Compare hashes, exclude identical files, regardless of their path.
for srci in "${!srcHashList[@]}"
do
for dsti in "${!dstHashList[@]}"
do
match=0
if [ "${srcHashList[$srci]}" == "${dstHashList[$dsti]}" ]
then
match=1
fi
if [ $match != 1 ]
then
newSrcList+=${srcFileList[$srci]}
newDstList+=${dstFileList[$dsti]}
fi
done
done
# ...move files after based on the new lists
Dies könnte definitiv sauberer gemacht werden, insbesondere wenn Sie nur an Dateien mit identischen Pfaden interessiert sind. Könnte wahrscheinlich auch in linearer Zeit gemacht werden, aber das allgemeine Konzept wird funktionieren.