Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
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
Dachdecker
30.11.08
13: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
Hilfreich?
0
Kommentare
Schnapper
30.11.08
14:23
Müsste mit rsync funktionieren.
Hilfreich?
0
Dachdecker
30.11.08
14:56
Schnapper
Müsste mit rsync funktionieren.
aus der manmage von rsync werd ich nicht schlau genug wie man das macht.
Hilfreich?
0
_mäuschen
01.12.08
10: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
Hilfreich?
0
Dachdecker
01.12.08
11: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.
Hilfreich?
0
Dachdecker
01.12.08
11: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.
Hilfreich?
0
twilight
01.12.08
12: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!“
Hilfreich?
0
Dachdecker
01.12.08
12: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.
Hilfreich?
0
hellgee666
01.12.08
13:16
Auf completedigitalphotography.com
gibt es eine Automator-Worklflow, das genau das macht. Nennt sich Compare Folders. Hier der Downloadlink
.
Hilfreich?
0
Dachdecker
01.12.08
13: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.
Hilfreich?
0
Dachdecker
01.12.08
13: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.
Hilfreich?
0
Dachdecker
01.12.08
14: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?
Hilfreich?
0
Dachdecker
01.12.08
15: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
Hilfreich?
0
_mäuschen
01.12.08
18:44
Super!
Doch wie umgehst jetzt die Leerzeichen in den Dateinamen?
Und das -R ist jetzt auch gar nicht mehr nötig
Hilfreich?
0
Dachdecker
01.12.08
22: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
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.