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-Key: 195791

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: b.enni
b.enni Dec 13, 2012 at 05:36:25 (UTC)
Goto Top
Moin,

-r
--recursive

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

Grüße,
Benni
Member: nevermind2012
nevermind2012 Dec 13, 2012 at 06:48:48 (UTC)
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.
Member: lexa-lexa
lexa-lexa Dec 13, 2012 updated at 13:49:13 (UTC)
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
Member: lexa-lexa
lexa-lexa Dec 13, 2012 at 13:46:20 (UTC)
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
Member: nevermind2012
nevermind2012 Dec 13, 2012 at 15:12:46 (UTC)
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.
Member: lexa-lexa
lexa-lexa Dec 13, 2012 at 17:46:17 (UTC)
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.
Member: b.enni
b.enni Dec 14, 2012 at 05:21:44 (UTC)
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.
Member: lexa-lexa
lexa-lexa Dec 14, 2012 at 13:56:32 (UTC)
Goto Top
Hi Benni,

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