Beispiel

Beispiel

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/1und b/foo/1identisch sind, aber a/bar/2und b/bar/2unterschiedlich 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/und b/foo/sind (rekursiv) identisch, also entfernen wir a/foo/.
  • a/bar/2und b/bar/2sind unterschiedlich, also tun wir nichts.
  • a/baz/existiert nur in, a/aber nicht in b/, also verschieben wir es nach b/baz/.

Gibt es dafür einen vorgefertigten Shell-Befehl? Ich habe das Gefühl, dass das rsyncfunktionieren 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.

verwandte Informationen