Shellbefehl Datein und Unterverzeichnisse kopieren, außer eine bestimmte Datei in nur einem Befehl mit cp?
Wie kann ich ein komplettes Verzeichniss, mit samt unterverzeichnissen und Dateien, AUßER einer Datei kopieren?
Indem ich nur cp oder mv oder mkdir benutze.
Und alles in EINEM Befehl.
erläuterung wäre nicht schlecht :)
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
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
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 :)
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.
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