668 Stimmen

Wie verwendet man den Befehl 'cp', um ein bestimmtes Verzeichnis auszuschließen?

Ich möchte alle Dateien in einem Verzeichnis mit Ausnahme einiger Dateien in einem bestimmten Unterverzeichnis kopieren. Ich habe festgestellt, dass cp Befehl hatte nicht die --exclude Option. Wie kann ich dies also erreichen?

24 Stimmen

11 Stimmen

tar -c | tar -x ?

2 Stimmen

@mvds, ich stimme Ihnen zu, tar mit '--exclude' zu verwenden ist eine gute Idee.

1148voto

hank Punkte 10262

rsync ist schnell und einfach:

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude

Sie können verwenden --exclude mehrere Male.

rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude

Beachten Sie, dass das Verzeichnis thefoldertoexclude nach --exclude ist relativ zu der Option sourcefolder d.h., sourcefolder/thefoldertoexclude .

Sie können auch Folgendes hinzufügen -n für einen Probelauf, um zu sehen, was kopiert wird, bevor der eigentliche Vorgang durchgeführt wird, und wenn alles in Ordnung ist, entfernen Sie -n von der Kommandozeile aus.

141voto

ulidtko Punkte 13601

Nun, wenn der Ausschluss bestimmter Dateinamensmuster von jedem unix-artigen Dateidienstprogramm (wie cp, mv, rm, tar, rsync, scp, ...) durchgeführt werden müsste, würde eine immense Doppelarbeit entstehen. Stattdessen können solche Dinge als Teil von kugeln d.h. durch Ihre Hülle.

bash

man 1 bash , / extglob .

Beispiel:

$ shopt -s extglob
$ echo images/\*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
$ echo images/!(\*.jpg)
images/004.bmp images/2252.png

Sie setzen also einfach ein Muster ein !() und negiert die Übereinstimmung. Das Muster kann beliebig komplex sein, ausgehend von einer Aufzählung einzelner Pfade (wie Vanwaril in einer anderen Antwort zeigt): !(filename1|path2|etc3) zu Regex-ähnlichen Dingen mit Sternen und Zeichenklassen. Einzelheiten finden Sie in der Manpage.

zsh

man 1 zshexpn , / Generierung von Dateinamen .

Das können Sie tun setopt KSH_GLOB und verwenden bashähnliche Muster. Oder,

% setopt EXTENDED\_GLOB
% echo images/\*
images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png
% echo images/\*~\*.jpg
images/004.bmp images/2252.png

Alors x~y passt zum Muster x , schließt aber Muster aus y . Auch hier finden Sie alle Einzelheiten in der Manpage.


Fisch neu!

El Fisch Schale hat eine viel schönere Antwort dazu:

 cp (string match -v '\*.excluded.names' -- srcdir/\*) destdir

Bonus-Pro-Tipp

Typ cp * , Treffer CtrlX* und sehen Sie einfach, was passiert. es ist nicht schädlich Ich verspreche

68voto

Linus Kleen Punkte 32759

Warum verwenden rsync wenn Sie es können:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Dies setzt voraus, dass die Struktur des Zielverzeichnisses mit der des Quellverzeichnisses übereinstimmt.

47voto

vineet kumar Punkte 493
cp -r `ls -A | grep -v "c"` $HOME/

42voto

securecurve Punkte 5370

Der einfachste Weg, den ich gefunden habe, ist der, dass Sie alle Dateien ohne Dateien und Ordner kopieren können, indem Sie einfach ihre Namen in Klammern hinzufügen:

shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X