Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>ausgabe von "diff" an "cp" weiterleiten

ausgabe von "diff" an "cp" weiterleiten

Dachdecker30.11.0813:56
Hallo,

ich stehe vor folgendem Problem: Ich habe 3 Ordner A, B und C. In A und B befinden sich Bilder in einigen Unterordnern. Am Ordner A und B wird unabhängig von einander gearbeitet. Jetzt möchte ich in gewissen Abständen die Ordner A und B vergleichen und die Dateien/Ordner die in B neuer/neu sind in den Ordner C kopieren.

Also im Prinzip das was dieser Befehl machen würde, nur eben nicht nach A, sondern nach C: "cp -R folderB/* folderA"

Ich habe auch schon versucht mit Hilfe von diff ("diff -q -r --suppress-common-lines folderA folderB") die Ausgabe per pipe an cp weiterzuleiten, aber ohne Erfolg.


Am liebsten wäre mir eine Bash Umsetzung.

Jemand ne Idee?

Vielen Dank,

Dachdecker
0

Kommentare

Schnapper30.11.0814:23
Müsste mit rsync funktionieren.
0
Dachdecker30.11.0814:56
Schnapper
Müsste mit rsync funktionieren.

aus der manmage von rsync werd ich nicht schlau genug wie man das macht.
0
_mäuschen
_mäuschen01.12.0810:29

#!/bin/bash

a=~/FOLDER_A/
b=~/FOLDER_B/
c=~/FOLDER_C/

for f in `ls "$b"`
do 
if [ ! -f "$a$f" ] || test "$b$f" -nt "$a$f"
then
cp -R "$b$f" "$c"
fi
done

0
Dachdecker01.12.0811:36
Das funktionierst schon sehr gut.
Nur leider klappt es nicht mit Leerzeichen in den Dateinamen und mit Ordnern. Bei Leerzeichen im Dateinamen spuckt mir cp einen Fehler aus. Der behandelt dann einfach die eine Datei, zb "Haus am See.tiff" als "Haus" "am" "See.tiff". Bei Unterordnern kopiert er einfach den kompletten Ordner als wäre er nicht in a enthalten.
0
Dachdecker01.12.0811:59
Wenn ich dein Skript richtig verstanden habe muss man die Schleife in etwas ähnliches wie

for f in `ls -R -1 "$b"`

ändern und dann noch nachträglich mit einem reg Ausdruck die Namen der Unterordner richtig zusammenbasteln.
0
twilight
twilight01.12.0812:44
Es gibt auch eine (nicht so perfekte) GUI für Rsync - nennt sich arRsync.

Peter
„Auch dienstlich tu ich mir garantiert kein Windows an!“
0
Dachdecker01.12.0812:49
twilight
Es gibt auch eine (nicht so perfekte) GUI für Rsync - nennt sich arRsync.

Peter

Das habe ich mir mal angeschaut. Jedoch habe ich es nicht so hinbekommen wie Anfangs beschrieben.
0
hellgee666
hellgee66601.12.0813:16
Auf completedigitalphotography.com gibt es eine Automator-Worklflow, das genau das macht. Nennt sich Compare Folders. Hier der Downloadlink.
0
Dachdecker01.12.0813:25
hellgee666
Auf completedigitalphotography.com gibt es eine Automator-Worklflow, das genau das macht. Nennt sich Compare Folders. Hier der Downloadlink.

Eigentlich ist es genau das wonach ich suche. Nur leider kann er im Zielordner nicht die Ordnerstruktur erstellen. Schade, aber ok.

Hat Jemand Erfahrung wie Automater Aktionen mit großen Datenmengen / Laufzeiten auskommen? Das Skript hätte beim aktuellem Bestand schon ca 40 GB zu verarbeiten. Deswegen hatte ich nach einer bash Lösung gesucht, da diese am sichersten durchläuft.

0
Dachdecker01.12.0813:40
Evt habe ich mich auch nicht genau genug ausgedrückt. Es gibt einen gleichen Dateinamen mehrfach, aber in anderen Unterordnern. Wenn nun im Zielordner keine Ordnerstruktur erstellt wird, muss er den Dateinamen ändern, was ich aber nicht möchte.

Nochmal zu dem Skript von _mäuschen... Man könnte doch mit `find $b"` die Schleife laufen lassen. Dann hat man alle Dateien auch mit kompletter Struktur. Jetzt müsste man jede Datei auf Vorkommen in $a prüfen und bei nicht Vorhandensein die Datei mit Ordnerstruktur nach $c kopieren.
0
Dachdecker01.12.0814:48
So, nach viel gebastel bin ich nun hier angekommen:

#!/bin/bash
a=test1
b=test2
c=test3

for f in `find "$b"/ -type f \! -name ".*"  | sed -e 's/ /\\ /g' | sed -e 's/^'"$b"'\/\///'`
do 
if [ ! -f "$a/$f" ] || test "$b/$f" -nt "$a/$f"
then
cp -R -v "$b/$f" "$c/"
fi
done

Jetzt fehlt nur noch das erstellen der Ordnerstruktur im Zielordner... hat da Jemand ne Idee wie man das umsetzen könnte?
0
Dachdecker01.12.0815:28
So, Skript steht.
#!/bin/bash

a=test1
b=test2
c=test3

for f in `find "$b"/ -type f \! -name ".*"  | sed -e 's/ /\\ /g' | sed -e 's/^'"$b"'\/\///'`
do 
    if [ ! -f "$a/$f" ] || test "$b/$f" -nt "$a/$f"
    then
        mkdir -p "$c/$f"tmp
        cp -R -v "$b/$f" "$c/$f"
        rmdir "$c/$f"tmp
    fi
done
0
_mäuschen
_mäuschen01.12.0818:44

Super!

Doch wie umgehst jetzt die Leerzeichen in den Dateinamen?

Und das -R ist jetzt auch gar nicht mehr nötig


0
Dachdecker01.12.0822:26
_mäuschen
Super!

Doch wie umgehst jetzt die Leerzeichen in den Dateinamen?

Und das -R ist jetzt auch gar nicht mehr nötig


Habe es umgeschrieben:
#!/bin/bash


a=test1  #old repos
b=test2  #new repos
c=test3  #dest repos


find "$b" -type f \! -name ".*" | sed -e 's/^'"$b"'\///' | while read f; do
# ls ~ | while read filename; do
    # echo $filename
    if [ ! -f "$a/$f" ] || test "$b/$f" -nt "$a/$f"
    then
        mkdir -p "$c/$f"tmp
        rmdir "$c/$f"tmp
        cp -R -v "$b/$f" "$c/$f"
    fi
    # other stuff
done
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.