bash = verzeichnisse vergleichen

Lord_Icon

Member
Moin,

ich hab mir ein kleines Script geschrieben, was mir bestimmte Ordner in einen anderen Ordner kopiert. Schreibrechte sollten dabei erhalten bleiben.

Code:
cd /tmp/ && tar cfp - . | (cd /mnt/ && tar xfp -)

Das klappt auch super.

Frage 1:
Nun würde ich gern, das das Script beide Verzeichnisse sicherheitshalber nochmal vergleicht und abbricht, wenn unterschiede festgestellt werden.


Frage 2:

Ich hab mir auch ne "Pause" eingebaut.
Code:
function pause(){
   read -p .$*.
}

und irgendwo im Script dann
Code:
pause "Drücke_Enter_wenn_fortgefahren_werden_soll_oder_STRG+C_zum_Abbruch_der_Operation"

LEider mußte ich das so machen (mit den _ ) weil = sobald ein Leerzeichen kommt, bricht der Text ab. Drum hab ich ein abbruch mitteld _ verhindet. Sieht aber nicht so toll aus. Einer eine Idee ?

Frage 3 und auch die letzte ;-)
Kann ich mit einen Script IN einer Datei eine Zeile suchen und
a: ein # davor setzen
b: eine Zeile am Ende der Datei einzufügen
 
Code:
cd /tmp/ && tar cfp - . | (cd /mnt/ && tar xfp -)
`cp -a [source] [target]` war dir zu einfach, oder?

Nun würde ich gern, das das Script beide Verzeichnisse sicherheitshalber nochmal vergleicht und abbricht, wenn unterschiede festgestellt werden.
Im Zweifel mit `diff` die beiden Verzeichnisse vergleichen oder mit `md5sum`, `sha1sum` o. ä. Hashes der einzelnen Dateien vergleichen. Sollte aber eigentlich unnötig sein. Du kopierst immerhin lokal und nicht über ein Netzwerk...

LEider mußte ich das so machen (mit den _ ) weil = sobald ein Leerzeichen kommt, bricht der Text ab. Drum hab ich ein abbruch mitteld _ verhindet. Sieht aber nicht so toll aus. Einer eine Idee ?
Code:
# Variante 1 - funktioniert auch ohne BASH
function pause(){
  echo $* 
  read
}

# Variante 2
function pause(){
   read -p "$*"
}
Vielleicht willst du dir ja mal den Advanced Bash-Scripting Guide durchlesen...

Kann ich mit einen Script IN einer Datei eine Zeile suchen und
a: ein # davor setzen
Suche nach grep, sed und awk.
b: eine Zeile am Ende der Datei einzufügen
`echo "foo">>/path/to/bar`
 
`cp -a [source] [target]` war dir zu einfach, oder?

nöö. Wieso ?
Eine solche "kopierung" wollte ich ja nicht.

cp im normalen modus kopiert mir ja das erste Verzeichniss mit.

Sprich: nach
cp -a /tmp/ /mnt/

hab ich im ORdner /mnt/ folgende Struktur:
/mnt/tmp/ => und hier dann alle Datein, die /tmp/ hat.

ich wollte aber
/mnt/ => alle Datein, die /tmp/ hat.

Und da is mir halt nur diese Idee gekommen.



Zum diff => kannste mir da mal ne Hilfestellung geben. Finde da in den man nichts.
Code:
diff -qr /tmp/ /mnt/
gibt mir dann aus:
Nur in /mnt/: lost+found.

Was ja korrekt ist, weil es ein gemountete Image Datei is.
Nun könnte ich vorher immer ein Befehl absetzen, der mit dieses Verzeichniss immer löscht... aber das geht doch bestimmt professioneller.

Ansonsten bekomme ich die if und while schleife nicht hin, wenn was ausgegeben wird.

Wegen den anderen Befehlen mach ich mich mal schlau
 
nöö. Wieso ?
cp im normalen modus kopiert mir ja das erste Verzeichniss mit.

Sprich: nach
cp -a /tmp/ /mnt/

hab ich im ORdner /mnt/ folgende Struktur:
/mnt/tmp/ => und hier dann alle Datein, die /tmp/ hat.

Probiers mal mit:
Code:
cp -a /tmp/* /mnt/
 
nope...

Code:
diff -qr /tmp/ /mnt/
Nur in /tmp/: .ICE-unix.
Nur in /mnt/: lost+found.
Nur in /tmp/: .X11-unix.

Aber wir schweifen ab... es wird immer jm. geben, der ein Script / Codeschnipsel noch besser oder kürzen kann.

Hast du ein paar Codezeilen für den Abgleich von Verzeichnissen, wo lost+found ignoriert wird und das script abbricht, wenn eine diff gefunden wird ?
 
Du machst was falsch, was ich dir geschrieben habe tut genau das, was Du wolltest.
Nämlich den Inhalt des einen Ordners in den anderen Ordner kopieren.

Beispiel:
Code:
niko@bunker ~ $ mkdir dir1
niko@bunker ~ $ mkdir dir2
niko@bunker ~ $ touch dir1/file1
niko@bunker ~ $ touch dir1/file2
niko@bunker ~ $ touch dir1/file3
niko@bunker ~ $ cp -a dir1/* dir2/
niko@bunker ~ $ ls -lah dir2/
total 2.0K
drwxr-xr-x  2 niko users  120 Jan  4 03:08 .
drwx------ 24 niko users 2.3K Jan  4 03:08 ..
-rw-r--r--  1 niko users    0 Jan  4 03:08 file1
-rw-r--r--  1 niko users    0 Jan  4 03:08 file2
-rw-r--r--  1 niko users    0 Jan  4 03:08 file3
niko@bunker ~ $
 
Mach mal nach dein touch auch n mkdir .. und dann nochmal den cp Befehl.

Sollte mich doch wundern, das dein Unix was anderes macht als meins :eek:
 
Stell bitte nochmal klar da was du erreichen willst.
Ist dein Bestreben den Inhalt von einem Verzeichnis in ein anderes zu kopieren?

Wenn du auch die Inhalte von Unterverzeichnissen von "dir1" kopieren willst, dann brauchst du den recursive Switch.
z.B. so:

Code:
# cp -ar dir1/* dir2/
 
Code:
# cp -ar <dir1>/* <dir1>/.* <dir2>/
Objekte in <dir1> mit . am Anfang muss man extra angeben. In den Unterverzeichnissen werden sie durch -r erfasst.
 
Aber wir schweifen ab... es wird immer jm. geben, der ein Script / Codeschnipsel noch besser oder kürzen kann.
Das hat ja nichts mit Kürzen zu tun, sondern damit, dass du `tar` für etwas missbrauchst, für das es nicht gedacht ist. Und diese Misuse bringt dir auch noch Nachteile in Form höherer Fehleranfälligkeit und Systemauslastung ein.
Wenn du auch die Inhalte von Unterverzeichnissen von "dir1" kopieren willst, dann brauchst du den recursive Switch.
cp(1) said:
-a, --archive
same as -dpR

Code:
# cp -ar <dir1>/* <dir1>/.* <dir2>/
Objekte in <dir1> mit . am Anfang muss man extra angeben. In den Unterverzeichnissen werden sie durch -r erfasst.
Uargh, dass '.*' auch '..' beinhaltet ist dir klar? Und was dann in Kombination mit dem `-a` Switch passiert auch?

Ich würde zu `cp -a source/{*,.[^.]*} target' tendieren. YMMV.
 
dass '.*' auch '..' beinhaltet ist dir klar?
Meine zsh sieht das anders... :P
zsh sieht . und .. nicht zu .* gehörig an. Finde ich auch richtig so.
Die Bash sieht das komischweise anders.
Steigt cp wirklich _auf_, wenn man ihm .. als rekursive Quelle gibt?
 
Woher soll `cp` denn wissen, dass es aufsteigt? Das folgt einfach blind den Verzeichnissen und in jedem Verzeichnis gibt es nunmal standardmäßig die Links '.' und '..'. (Jaja, könnte man programmatisch abfangen, wird aber offenbar nicht gemacht ;))
 
Back
Top