Shellbefehl Datein und Unterverzeichnisse kopieren, außer eine bestimmte Datei in nur einem Befehl mit cp?

5 Antworten

Hallo

Wie kann ich ein komplettes Verzeichniss, mit samt unterverzeichnissen und Dateien, AUßER einer Datei kopieren?

Du könntest cp oder mv mit dem Parameter -i verwenden um das kopieren jeder Datei zu bestätigen:

cp -Ri /home/$USER/* /ZIELPFAD/

Dann einfach bei der nicht zu kopierenden Datei "nein sagen" und gut.

Und alles in EINEM Befehl.

Du meinst damit sicher das keine Pipe verwendet werden soll oder?

erläuterung wäre nicht schlecht :)

Mit

man cp
cp --help
man mv
mv --help

Kannst Du die Bedeutung der Parameter & Optionen finden.

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

Na gut.

Hinweis 1: Normalerweise macht man so etwas mit find.

Hinweis 2: Nehmen wir deine Aussage "Und alles in EINEM Befehl." mal wörtlich. Also, dass tatsächlich nur ein einziges mal cp ODER mv ODER mkdir vorkommen darf. Ansonsten kannst Antwort von guenterhalt anschauen.

Aber ja, wenn man bisschen trickst, kommt man mit ein mal cp aus ;).

Vorraussetzung: Man hat ein bash mit nullglob. Also:

shopt -s nullglob

Angenommen das Ziel ist ZIEL, die Datei zum excluden ist "exclude":

cp -r *[^e][^x][^c][^l][^u][^d][^e]* ?????? ????? ???? ??? ?? ? ZIEL

Also bisschen mit regex gespielt ;).

*[^e][^x][^c][^l][^u][^d][^e]*

matcht auf alle Dateien mit mind. 7 Buchstaben AUßER auf exclude. Ließ:

Alles, wo beliebige Buchstaben, Irgendetwas, aber nicht e, Irgendetwas, aber nicht x, Irgendetwas, aber nicht c, Irgendetwas, aber nicht l, Irgendetwas, aber nicht u, Irgendetwas, aber nicht d, Irgendetwas, aber nicht e, Beliebige Buchstaben.

Eben das einzige Wort, dass darauf nicht zutrifft ist exclude.

??????

sind alle Dateien mit exakt 6 Buchstaben. Das braucht man dann noch für 5, 4, 3, 2, und 1 Buchstaben.

Und schon hat man mithilfe von bash alle Dateien AUßER exclude.

nullglob braucht man, dass z.B. ? zu "" wird, sofern keine Datei mit nur einem Buchstaben existiert.

Ob das natürlich die erwünschte Lösung ist, weiß ich nicht. Aber unter der Vorraussetzung, dass man nur 1 Befehl verwenden darf, die wohl einzige Lösung (?).

Gruß, Tuxgamer

Ich mache dir nur sehr ungern deine Hausaufgaben. Wer auch immer dir die gestellt hat, hatte bestimmt seinen Grund - und wäre bisschen witzlos, wenn ich dir die Lösung einfach hinschreiben würde.

Aber mal logisch gedacht:

Indem ich nur cp oder mv oder mkdir benutze.

Und alles in EINEM Befehl.

mv verschiebt, mkdir erstellt Verzeichnis. Bleibt also wohl nur noch cp, richtig?

Mal in "man cp" reingeschaut, du suchst also einen Befehl der Form:

cp [OPTION]... SOURCE... DIRECTORY

Jetzt kannst mal in man cp bisschen rumschauen (einfach mal machen), ob du was hilfreiches findest.

Ist eher unwahrscheinlich. Naja, gibt nämlich noch einen Trick:

regex in bash

Oder allgemein in der Unix-Shell. Also wenn du z.B. in bash schreibst: cp * .. ersetzt dir bash das * durch alle Dateien im Arbeitsverzeichniss, die nicht mit . anfangen. Eben weil * auf alle solche Dateien matcht.

Das ist offiziell hier spezifiziert:

http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13_03

Gibt aber auch Seiten, die das bisschen verständlicher beschreiben.

http://wiki.bash-hackers.org/syntax/pattern#bracket_expressions

Und in der Tabelle solltest du eigentlich etwas hilfreiches finden?

Gruß, Tuxgamer

Kampfsorb 
Fragesteller
 07.11.2017, 13:35

Bin da leider ein purer Anfänger und hatte relativ viel zu tun und lernen. Bislang stehe ich überall im studium auf Sehrgut. Leider hatte ich dann Abends keine Zeit mehr gehabt um mir dasnzu suchen ':D. Habs probiert... aber km man kichts gefunden und sonst wo auch nicht... da ich keine versteckte datei excludieren kann, ist cp * nicht das Richtige für mich.

Jetzt wo ich ausgeschlafen bin kommt mir auch soforr die Idee: meine datein in diesem Verzeichnis was ich kopieren soll, sind alle gleichnamig, außer die zu excludierende Datei. Dann kann ich einfach die Umkehrnehmen und sagen copiere die Dateien, welche so und so heißen.

Dennoch danke :)

0

kopieren sagt schon, dass cp benutzt werden soll.
So etwas wie exclude=<Dateiname> als Option von cp konnte ich aber nicht finden.
Da als Zusatzbedingung "in einem Befehl" angegeben ist, kann wohl nur die Lösung von @Linuxhase ( cp -i ) benutzt werden.
Etwas anderes ist es, wenn "in einer Zeile" die Bedingung wäre.

In dem Falle würde ich

cp -r * <Ziel-Verzeichnis> ; rm <Zielverzeichnis>/<die-auszuschließende-Datei>

benutzen. 

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

tail +11 zeigt alle Zeilen nach der 10 Zeile. Wenn es weniger sind, dann wird nichts ausgegeben.
Beispiel:
$ ls
file1 file2 file3 file4 file5 file6 file7 file8 file9

user@PC /cygdrive/c/tmp/test
$ touch file10 file11 file12

user@PC /cygdrive/c/tmp/test
$ ls -t | tail +11
file1
file2

So kann ich es mir vorstellen aber keine Ahnung ich hab noch nie mit powershell gearbeitet