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?
Antworten
Zu viele Anzeigen?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.
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
- See previous answers
- Weitere Antworten anzeigen
24 Stimmen
rsync?
11 Stimmen
tar -c | tar -x
?2 Stimmen
@mvds, ich stimme Ihnen zu, tar mit '--exclude' zu verwenden ist eine gute Idee.
4 Stimmen
Mögliches Duplikat von Ordner rekursiv kopieren, einige Ordner ausschließen