*
Sie können also als Platzhalter für alle Dateien verwenden, wenn Sie cp
sie im Kontext eines Verzeichnisses verwenden. Gibt es eine Möglichkeit, alle Dateien außer x
der Datei zu kopieren?
Antwort1
Rsync handhabt dies gut.
Beispiel: Alles kopieren:rsync -aP /folder1/* /folder/2
Beispiel: Alles kopieren mit Ausschluss:rsync -aP --exclude=x /folder1/* /folder2/
Der -aP
Schalter:
a
: Ähnlich wiecp -a
, rekursiv usw.P
: Zeigt den Fortschritt, eine nette Funktion von rsync.
Antwort2
In bash
können Sie verwenden extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
wo !(b*)
alle b*
Dateien ausgeschlossen werden.
Sie können später deaktivieren extglob
mit
$ shopt -u extglob
Antwort3
Dies ist keine Funktion von cp
, sondern eine Funktion Ihrer Shell (es erweitert das *
auf alle Dateien außer dem Punkt). Die Antwort hängt also davon ab, welche Shell Sie verwenden. Beispielsweise zsh
unterstützt das diese Syntax:
$ cp ^x /path/to/destination
Wobei ^x
„alle Dateien außer x
“ bedeutet.
Sie können Auswahl- und Abwahlmuster auch kombinieren. Um beispielsweise alle WAV-Dateien außer denen, die xyz enthalten, zu kopieren, können Sie Folgendes verwenden:
cp *.wav~*xyz*
Antwort4
Könnte auch in der guten alten (portablen/kompatiblen) Bourne-Shell auf verschiedene Arten und mit Standardtools erfolgen, allerdings auf viel weniger elegante Weise als durch die Verwendung von erweitertem Shell-Globbing oder Befehlen mit integrierten Ausschlussoptionen.
Wenn es nicht zu viele Dateien sind (und keine Namen mit Leerzeichen und/oder Zeilenumbrüchen), könnte dies eine Möglichkeit sein:
cp `ls | egrep -v '^excludename$'` destdir/.
Sicher, bash
und GNU-Tools sind großartig und leistungsstark, aber sie sind trotzdem nicht immer verfügbar. Wenn Sie beabsichtigen, es in ein portables Skript einzufügen, würde ich es find
wie im Kommentar von Rush empfehlen.