Wie cp-Datei und Verzeichnis erstellen, wenn nicht vorhanden?

15

Ich möchte geänderte Dateien in einem SVN-Repository in ein anderes Verzeichnis kopieren und dabei die Verzeichnisstruktur beibehalten.

Nachdem ich die Hilfeseiten awk und xargs gelesen habe, finde ich eine Möglichkeit, die Dateinamen wie folgt zu ändern:

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

Das Problem ist aber, dass auf diese Weise Verzeichnisstrukturen nicht erhalten bleiben, ich möchte Dateien wie diese kopieren:

./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h

Ich habe versucht, den Befehl cp in cp '{}' / tmp / xen / '{}' zu ändern , aber es wurde keine solche Datei oder kein solches Verzeichnis angegeben. Gibt es eine Möglichkeit, eine cp-Datei zu kopieren und ein Verzeichnis zu erstellen, falls erforderlich? Und bitte weisen Sie darauf hin, ob diese Befehlskette vereinfacht werden kann. :-)

Vielen Dank für alle Ihre Antworten. Da das Verzeichnis etwas groß ist, möchte ich nicht das gesamte Verzeichnis mit cp -R oder rsync kopieren. Der Vorschlag von CK, eine Teerpfeife zu verwenden, ist sehr nützlich.

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)
ZelluX
quelle

Antworten:

12

Ein paar kurze Gedanken:

  • Füge ein mkdir -p $ (dirname FILE) hinzu
  • Könnten Sie eine Teerpfeife verwenden, um alles zu klären?

Bearbeiten

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

Sollte ein Archiv der geänderten Dateien erstellen. Dann:

  tar -xf archive.tar -C /tmp/xen

sollte es setzen, wo Sie wollen. Wenn es in einem Schritt sein muss, ist das auch möglich.

CK.
quelle
4

rsync macht das ziemlich einfach, es ist das Werkzeug, mit dem ich im Allgemeinen ganze Verzeichnisstrukturen kopiere:

rsync -av /home/source/svn/repo /home/dest/svn/

Dadurch wird das Repo-Verzeichnis und der gesamte Inhalt im Verzeichnis / home / dest / svn erstellt, sodass Sie / home / dest / svn / repo / ... haben.

Also für Sie zum Beispiel:

rsync -rv ./ /tmp/xen/

-a, würde Zeitstempel erhalten und unter anderem rekursiv sein, 'man rsync'.

Update nachdem mir klar wurde, dass ich die Frage falsch gelesen habe:

So ahmen Sie die Verzeichnisstruktur nach (tar alternative):

rsync -av --include='*/' --exclude='*' source destination

Und dann, um die Dateien vor etwa 20 Minuten zu kopieren:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/
Kyle Brandt
quelle
Das liegt auf der Hand, aber das synchronisiert alles, nicht nur die geänderten Dateien, oder?
CK.
Hoppla, habe das verpasst
Kyle Brandt
2

Hier ist der Einzeiler als Referenz:

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

Und auf englisch:

  • Liste der Dateien von Interesse mit svn status -q, die weitergeleitet werden in ...
  • awk extrahiert die Spalte mit den Dateipfaden: awk '{print $2}'
  • xargs wird verwendet, um die Liste der Dateien an tar zu übergeben, wodurch wiederum ein Tarball der Dateien an stdout gesendet wird: xargs tar -c
  • Das wird sofort wieder -xin das Zielverzeichnis extrahiert ( -C path):tar -xC /tmp/xen
Tim Abell
quelle
1

Verwenden Sie "dirname", um den Pfad "mkdir -p" zu extrahieren und zu erstellen.

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/
Wazoox
quelle
1

rsync -a erstellt keine neuen Verzeichnisse tiefer als in Tiefe 1, daher ist rsync nur eine Teillösung und zum Beispiel nicht für mich geeignet )

Bearbeiten: Ich meine, ich habe Quellverzeichnis: /home/user/projects/homework/1/1.1/ Und ich möchte es mit Remote synchronisieren: /home/user/projects/homework/1/1.1/ ... aber Ziel hat noch kein Verzeichnis / home / user / projects / homework ... und ich möchte keine anderen Unterverzeichnisse auf dem Quellcomputer übertragen, die sich in / home / user / projects / befinden.

Edit2: Einen Weg gefunden, mit rsync --relative Option: Das obige Beispiel würde so aussehen:

cd / home / projekte /; rsync -aR Hausaufgaben / 1 / 1.1 Benutzer @ Remote: / home / Benutzer / Projekte /

zimon
quelle
0

Ich würde folgendes vorschlagen:

  • alles kopieren
  • Suchen Sie nach nicht geänderten Dateien und löschen Sie diese. Die geänderten Dateien bleiben an ihrem Platz.

Übrigens kopiert cp with R flag Dateien / Ordner rekursiv.

cp -R
Karolis T.
quelle
0
  • Verzeichnisstruktur /tmp/f2für Dateien in erstellen/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • Datei in neues Ziel kopieren /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
ren8zhu
quelle