TS: Mit cp ganze Verzeichnisbäume kopieren

Hallo Leute,

ich habe das aus dem anderen Thread nochmal herausgeholt, weil es dort nicht hineingehört und ich das Thema gerne gesondert nochmal ansprechen möchte:

Wie kann ich mit cp alle Dateien eines Verzeichnisses kopieren (z.B. auf eine andere Platte), inclusive der versteckten, aber nur dann, wenn die Quelldatei neuer ist?

Jörg gab folgende Tipps:

cd /tmp
mkdir test
cd test
cp -au /home/ts ./
  • -a archive
  • -u nur neuere
  • /home/ts - Verzeichnis mit Inhalt - legt aber Verzeichnis an

Variante mit Trick:

cp -u /home/ts/* /home/ts/.* /tmp/test/

weitere, extrem vorteilhafte Variante:

rsync quelle ziel
  • kennt viele Optionen, geht auch über das Netz (ssh)

Ich habe den halben Nachmittag damit herumprobiert und gelesen. Aber es dtand nurt viel Mist im Netz, der leider nicht funktionierte.

cp hat die unangenehme Eigenschaft, dass es beim ersten Kopieren eines Verzeichnbisbaumes an eine andere Stelle funktioniert, beim zweiten Mal (wenn das Zielverzeichnis bereits vorhanden ist) aber leider den Verzeichnisbaum als Unterverzeichnis anlegt.
Die Aufgabe lautet

test -> test2

und nicht

test -> test2/test

Ich habe da nun eine Lösung, bei der mir aber nicht ganz wohl ist. Sie funbktioniert aber bisher und ich konnte keine Fehler feststellen. Wäre trotzdem schön, das nochmal zu diskutieren:

mkdir test2
cp -rauvt test2 test/.

Mit -t wird das Zielverzeichnis angegeben. Es werden nur die neuen Dateien kopiert, inclusive der versteckten. Das kann man beliebig oft wiederholen.

Tschüss
TS

  1. Tach,

    cp hat die unangenehme Eigenschaft, dass es beim ersten Kopieren eines Verzeichnbisbaumes an eine andere Stelle funktioniert, beim zweiten Mal (wenn das Zielverzeichnis bereits vorhanden ist) aber leider den Verzeichnisbaum als Unterverzeichnis anlegt.

    cp möchte, wenn du ihm ein Verzeichnis als Ziel gibst immer erstmal neue Dateien in diesem Verzeichnis anlegen (im Gegensatz zu rsync siehe unten).

    So kopiert

    cp -ruav verzeichnis1/ verzeichnis2/
    

    verzeichnis1 in verzeichnis2 hinein (hinterher existiert also verzeichnis2/verzeichnis1), egal wie die Trailing Slashes vergeben sind (Achtung bei anderen Tools wie rm und mv ist der Trailing Slash bei der Quelle unter Umständen entscheidend! Und der Slash hilft einem, falls man versehentlich eine Datei statt eines Verzeichnisses angibt, die Tools beschweren sich dann, was besonders bei Scripten relevant ist).

    Ich würde mit cp die Schreibweise

    cp -ruav verzeichnis1/* verzeichnis2/
    

    verwenden; die explizit allen Inhalt von verzeichnis1 in verzeichnis2 kopiert, solange der Inahlt nicht einen zu langen String ergibt (die Wildcard wird von der Bash aufgelöst und eine Bash-Code-Zeile darf nur eine bestimmte Länge besitzen), weswegen es die Schreibweise deiner Lösung gibt:

    mkdir test2
    cp -rauvt test2 test/.
    

    Das „/.“ am Ende wirkt im Endeffekt genauso wie das „/*“, indem es den Verzeichnisinhalt refferenziert (Mir fällt zumindest im Moment kein gegenbeispiel dafür ein)

    rsync quelle ziel
    
    • kennt viele Optionen, geht auch über das Netz (ssh)

    Ich würde auch eher rsync nutzen, einfach, weil es im allgemeinen schneller ist (es versucht nur Dateiänderungen statt komplette Dateien zu übertragen), nicht nur das Dateidatum als Unterschiedsquelle heranziehen kann und die Dateiattribute erhalten kann; und da sähe das was du möchtest folgendermaßen aus:

    rsync -av verzeichnis1/ verzeichnis2/
    

    Man beachte den Trailing Slash beim Quellverzeichnis, ohne würde rsync sich verhalten wie cp und wiederum ein Unterverzeichnis verzeichnis1 anlegen.

    mfg
    Woodfighter

    1. Moin!

      Ich würde mit cp die Schreibweise

      cp -ruav verzeichnis1/* verzeichnis2/
      

      verwenden; die explizit allen Inhalt von verzeichnis1 in verzeichnis2 kopiert

      Das kannst Du jetzt nicht wissen: Die ursprüngliche Anfrage im anderen Thread bezog sich auch auf versteckte Dateien. Und die löst der Asterix nicht mit auf.

      rsync -av verzeichnis1/ verzeichnis2/
      

      Vermutlich immer dann die schönste Lösung, wenn man es wiederholt tut und mehr will. Allein die Tatsache, man excludes und includes einfach als Liste in separaten Dateien speichern kann, macht die Arbeit damit als Backup-Tool richtig angenehm.

      Ich benutzte das für Datenbackups.

      Statt in Foren rumzusuchen:

      man rsync und noch viel mehr info rsync offenbaren die Macht und Schönheit des Tools.

      Jörg Reinholz

      1. Tach,

        Das kannst Du jetzt nicht wissen: Die ursprüngliche Anfrage im anderen Thread bezog sich auch auf versteckte Dateien. Und die löst der Asterix nicht mit auf.

        stimmt, das ist Einstellungssache „shopt -s dotglob“.

        mfg
        Woodfighter

        1. Hallo und guten Morgen,

          Das kannst Du jetzt nicht wissen: Die ursprüngliche Anfrage im anderen Thread bezog sich auch auf versteckte Dateien. Und die löst der Asterix nicht mit auf.

          stimmt, das ist Einstellungssache „shopt -s dotglob“.

          Ok, dann bleibt also also eine weiter Lösung jetzt übrig:
          User == root

          
          root@lappi:# mkdir -p /home/backup/ziel
          root@lappi:# shopt -s dotglob
          root@lappi:# cp -rauv /home/ts/quelle/* /home/backup/ziel/
          root@lappi:# 
          
          

          Danke für die Kopierberatung :-)

          In wieweit werden sich da Daten, Namen und Attribute usw. unterscheiden zum Kopieren mit Windows?
          Was ist mit den Zeichensätzen/Kodierungen für die Dateipfade? Unter Windows wurden durchaus Dateinamen, wie "Blöder Scheiß Ärger.doc" benutzt.

          Grüße
          TS

          1. Moin!

            Hallo und guten Morgen,

            Das kannst Du jetzt nicht wissen: Die ursprüngliche Anfrage im anderen Thread bezog sich auch auf versteckte Dateien. Und die löst der Asterix nicht mit auf.

            stimmt, das ist Einstellungssache „shopt -s dotglob“.

            Ok, dann bleibt also also eine weiter Lösung jetzt übrig:
            User == root

            
            root@lappi:# mkdir -p /home/backup/ziel
            root@lappi:# shopt -s dotglob
            root@lappi:# cp -rauv /home/ts/quelle/* /home/backup/ziel/
            root@lappi:# 
            
            

            Danke für die Kopierberatung :-)

            In wieweit werden sich da Daten, Namen und Attribute usw. unterscheiden zum Kopieren mit Windows?

            Da könnten sich tatsächlich Probleme ergeben. Linux kennt die Windows-Benutzer nicht. Linux kennt auch kein Archiv-Bit und Linux "versteckt" Dateien, indem es einen Punkt vor den Name setzt. Was es beim Kopieren von Dateien von einer Windows-Partition aber gerade nicht tut.

            Was ist mit den Zeichensätzen/Kodierungen für die Dateipfade? Unter Windows wurden durchaus Dateinamen, wie "Blöder Scheiß Ärger.doc" benutzt.

            Aus man 8 mount

            Mount options for ntfs
                   iocharset=name
                          Character set to use when returning file names.  Unlike VFAT, NTFS suppresses names that contain nonconvertible char‐
                          acters. Deprecated.
            
                   nls=name
                          New name for the option earlier called iocharset.
            
                   utf8   Use UTF-8 for converting file names.
            
                   uni_xlate={0|1|2}
                          For 0 (or `no' or `false'), do not use escape sequences for unknown Unicode characters.  For 1 (or `yes'  or  `true')
                          or  2,  use  vfat-style  4-byte  escape  sequences  starting  with  ":". Here 2 give a little-endian encoding and 1 a
                          byteswapped bigendian encoding.
            

            Ähnliches gibts auch für v(fat)(msdos ... Ob Du da überhaupt Optionen meim Mounten angeben

            #Beispiel:
            ~$ sudo mount -o ro,utf8 /dev/disk/by-name/windows /media/windows
            

            musst hängt von den Einstellungen von gleich 2 OS, unter Umständen sogar vom Linux-Benutzer

            #bei mir gesetzt in ~/.profile
            fastix@trainer:~$ echo $LANG
            de_DE.UTF-8
            

            ab. Und ich kann es jetzt nicht probieren...

            Jörg Reinholz