Ich möchte einen recusiven cp befehl schreiben der aber nur
einen Datentyp kopiert.
cp -R /ordner1/*.sh /ordner2/
Das klappt nicht, da der Stern von der Shell expandiert wird. Was dabei passiert kann man mit ls /ordner1/*.sh ansehen. Dieser copy wird alle *.sh Dateien im ordner1 in ordner2 kopieren.
cp: cannot stat `/ordner1/*.sh’: No such file or directory
Das heißt, dass es /ordner1/*.sh nicht gibt! Da die *.sh Dateien in Unterordnern von /ordner1 liegen, ist das zu erwarten.
cp kann das nicht. In bash kann man die Aufgabe mit einem Einzeiler lösen:
for f in find /ordner1 -type f -name '*.sh'; do install -D „$f“ „/ordner2${f##/ordner1}“; done
Hallo,
ich versuche zu helfen mit einer Gegenfrage:
kann es sein, dass der cp-Befehl in einem Script ausgeführt wird ?
Wurde dieses Script mit einem Windows Editor erstellt?
Falls ja, bitte das Script in einem Unix Editor wie z.B. Vi erstellen und speichern. Danach dürfte keine Fehlermeldung mehr erscheinen. Das Stichwort hierzu wäre: falsche EOL Zeichen !
Also, Du hast Ordner die heißen copy_me.* unter /ordner1, die mit Inhalt in /ordner2 kopiert werden sollen. Das müsste ungefähr wie folgt klappen:
for d in find /ordner1 -type d -name "copy_me.*";do mkdir -p „/ordner2${d##/ordner1}“;cp -aR „$d“ „/ordner2${d##/ordner1}“;done
sowas wie /ordner1/copy_me.1/copy_me.2 wird dann zwar doppelt kopiert, macht aber nix. Wenn die Ordner direkt unter /ordner1 hängen, müsste es cp auch direkt können:
cp -aR /ordner1/copy_me.* /ordner2
Das kopiert aber auch Dateien die copy_me.* heißen. Sonst kann man bei find ein -maxdepth einwerfen.
for d in find /ordner1 -type d -name "copy_me.*";do mkdir -p
„/ordner2${d##/ordner1}“;cp -aR „$d“
„/ordner2${d##/ordner1}/…“;done
Stimmt, versuch mal cp -aR „$d/*“ „/ordner2${d##/ordner1}“.
Im Zweifelsfall hilft immer vor den Befehl ein echo zu schreiben, um zu sehen was genau passiert.
Ist Dein Problem inzwischen gelöst?
Wenn nicht, versuch mal folgendes:
erstelle im Ordner1 eine Datei leer.sh oder so
wichtig: sie muss Deinen Kriterien zum kopieren entsprechen.
Danach sollte es funktionieren.