lexa-lexa
Goto Top

Rekursiv kopieren inkl. Verzeichnissen, Verzeichnisbaum

cp -r und cp -P bewirkt das nicht

Wie kann ich unter Linux eine Datei unter Beibehaltung der Verzeichnisstruktur kopieren? Wenn das Verzeichnis (Ordner) nicht existiert, soll es erstellt werden:

cp /das/ist/die/datei.txt /tmp

Ergebnis: /tmp/das/ist/die/datei.txt

Content-ID: 195791

Url: https://administrator.de/contentid/195791

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

b.enni
b.enni 13.12.2012 um 06:36:25 Uhr
Goto Top
Moin,

-r
--recursive

Bei man cp brauchst du noch nicht mal weit runterscrollen...

Grüße,
Benni
nevermind2012
nevermind2012 13.12.2012 um 07:48:48 Uhr
Goto Top
Dann kann er aber nur sagen

cp -r /das /tmp

und es landet alles was unter /das liegt in /tmp, oder täusch' ich mich?
Also z.B. auch /das/datei-xyz oder das/ist/datei-abc.

Kann natürlich sein, dass das genau das ist was er möchte, aber ich habe es so verstanden, dass er nur /das/ist/die/datei.txt kopieren will (inklusive der darüber liegenden Verzeichnisstruktur), nicht aber andere Dateien die eventuell noch in den höheren Verzeichnissen liegen.
lexa-lexa
lexa-lexa 13.12.2012 aktualisiert um 14:49:13 Uhr
Goto Top
Hi Benni,

Bei man cp brauchst du noch nicht mal weit runterscrollen...

du hast die Problemstellung nicht verstanden.

Und drüber steht auch ganz fett: "cp -r und cp -P bewirkt das nicht"

Probier's bitte nochmal, falls du ausser Hinweisen auf die manpages noch mehr drauf hast.
Fürchterlich, diese ManPage-Schluckreflexe der vermeintlichen Linux-Kenner face-sad

Gruss Axel

edit: Anrede + Ironie
lexa-lexa
lexa-lexa 13.12.2012 um 14:46:20 Uhr
Goto Top
Zitat von @nevermind2012:
...ich habe es so verstanden, dass er nur
/das/ist/die/datei.txt kopieren will

Korrekt! Nur einzelne Dateien inkl. deren Pfad. Nicht komplette Pfade, das wäre ja zu einfach face-wink
nevermind2012
nevermind2012 13.12.2012 um 16:12:46 Uhr
Goto Top
So... hat ein Weilchen gedauert, aber was soll man während der Arbeitszeit auch sonst machen *lol*

  1. BEGIN -------------------------------------------------------

#!/bin/bash

#-------------------------------------------------------

FILE=datei

FOLDER=das

TOPFOLDER=/home/user/

DEST=/tmp

#-------------------------------------------------------

cd $TOPFOLDER

DIR=$(find $FOLDER -name $FILE)

LIST=$(echo $DIR | tr "/" "\n")

cd $DEST

for i in $LIST
do

[ $i != $FILE -a ! -e $i ] && mkdir $i

if [ $i != $FILE ]; then
cd $i
else
cp $TOPFOLDER$DIR .
fi

done

  1. END ------------------------------------------------------

FILE ist der Dateiname
FOLDER ist das Verzeichnis ab dem kopiert werden soll
TOPFOLDER muss (wie der Name schon erahnen lässt) das Verzeichnis über FOLDER sein
DEST ist das Zielverzeichnis

So wie es oben steht kopierte das Skript die Datei

/home/user/das/ist/die/datei

nach

/tmp/das/ist/die/datei

Das "find" kann man natürlich auch weglassen und den Pfad zur Datei direkt angeben, dann spart man sich auch die TOPFOLDER-Geschichte.
lexa-lexa
lexa-lexa 13.12.2012 um 18:46:17 Uhr
Goto Top
Zitat von @nevermind2012:
So... hat ein Weilchen gedauert, aber was soll man während der Arbeitszeit auch sonst machen *lol*

Danke Dir für die Inspiration!

Dein Script kann so nicht verwendet werden, denn es geht natürlich nicht um *eine* Datei, die hätte ich schnell mal händisch kopiert, sondern eine Dateiliste. Da dort einige Dateinamen doppelt vorkommen, wird das Script vermutlich am "find" Befehl ins Stolpern kommen.

Habe gerade auch (aber *nach* der Arbeit face-wink ) wieder Lust zum scripten bekommen und eine Stunde lang vergeblich versucht es hinzubekommen. Problem war immer wieder, dass der letzte Parameter, der ja der Dateiname war, als Verzeichnis erstellt wurde:
#!/bin/bash

FLIST="files.txt"

while read F ; do

   DEST="/tmp/test1"
   LIST=$(echo $F | tr "/" "\n")

   for i in $LIST ; do
      DEST="$DEST/$i"
      echo "Ziel: $DEST"
      if [ ! -d $DEST ] && [ ! -f $DEST ] ; then
         mkdir $DEST
      fi
   done

done < $FLIST

Das war mir dann doch zu doof, weil es unmögliche Ausmasse annimmt. Daher habe ich mich nun entschlossen, kurzen Prozess zu machen und TOPFOLDER zu ignorieren:
#!/bin/bash

FLIST="files.txt"
DEST="/tmp"

while read F ; do

   cp -r --parents $F $DEST

done < $FLIST

PS: Eigentlich ging ich davon aus, dass "cp -P" dasselbe ist wie "cp --parents", es gibt aber scheinbar Unterschiede in den Distris. Aktuell bewege ich mich auf einer älteren SuSE. Werde gelegentlich mal bei Debian nachschauen.
b.enni
b.enni 14.12.2012 um 06:21:44 Uhr
Goto Top
Moin lexa,

dann entschuldige meine unqualifizierte Antwort.
Ich habe die Frage falsch verstanden und das fett geschriebene dazu noch überlesen - war alles vor dem ersten Kaffee.
lexa-lexa
lexa-lexa 14.12.2012 um 14:56:32 Uhr
Goto Top
Hi Benni,

wird gern angenommen. Vor dem ersten Kaffe ist (fast) alles entschuldbar face-smile