Sie können also die *
als Platzhalter für alle Dateien verwenden, wenn Sie sie cp
im Kontext eines Verzeichnisses verwenden. Gibt es eine Möglichkeit, alle Dateien außer der x
Datei zu kopieren ?
Sie können also die *
als Platzhalter für alle Dateien verwenden, wenn Sie sie cp
im Kontext eines Verzeichnisses verwenden. Gibt es eine Möglichkeit, alle Dateien außer der x
Datei zu kopieren ?
Antworten:
In können bash
Sie verwenden extglob
:
$ shopt -s extglob # to enable extglob
$ cp !(b*) new_dir/
wo !(b*)
alle b*
Dateien ausschließen.
Sie können später deaktivieren extglob
mit
$ shopt -u extglob
find
ist der einzige Weg in tcsh
:find . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
Rsync handhabt dies gut.
Beispiel alle kopieren: rsync -aP /folder1/* /folder/2
Beispiel kopieren alle mit Ausschluss: rsync -aP --exclude=x /folder1/* /folder2/
Der -aP
Schalter:
a: Ähnlich wie cp -a
, rekursiv usw. P: Zeigt den Fortschritt an, eine nette Funktion von rsync.
-rP
anstelle von, -aP
wenn Sie wiederkehren möchten. -a
ist für die Archivierung. Ich bin mir nicht sicher, ob sich dies geändert hat oder ob es nur unter MacOS anders ist.
rsync
hat die Option, es rekursiv zu machen. Beispiel: rsync --recursive -P --exclude=x /folder1/* /folder2/
. (Getestet nur auf Ubuntu)
Dies ist keine Funktion von cp
, es ist eine Funktion Ihrer Shell (es erweitert sich *
, um alle Nicht-Punkt-Dateien zu bedeuten), daher hängt die Antwort davon ab, welche Shell Sie verwenden. zsh
Unterstützt zum Beispiel diese Syntax:
$ cp ^x /path/to/destination
Wo ^x
bedeutet "alle Dateien außer x
"
Sie können auch Selektions- und Deselektionsmuster kombinieren, um z. B. alle WAV-Dateien mit Ausnahme derjenigen, die xyz enthalten, zu kopieren, können Sie Folgendes verwenden:
cp *.wav~*xyz*
bash
?
Könnte auch in einer einfachen alten (portablen / kompatiblen) Borowski-Shell auf vielfältige Weise mit Standardwerkzeugen auf weniger elegante Weise ausgeführt werden als mit erweiterten Shell-Globbing- oder -Befehlen mit integrierten Ausschlussoptionen.
Wenn es nicht zu viele Dateien gibt (und keine Namen mit Leerzeichen und / oder Zeilenumbrüchen), kann dies eine Möglichkeit sein:
cp `ls | egrep -v '^excludename$'` destdir/.
Sicher, bash
und GNU-Tools sind großartig und leistungsstark, aber sie sind immer noch nicht immer verfügbar. Wenn Sie beabsichtigen, es in ein portables Skript zu schreiben, würde ich dies find
wie im Kommentar von Rush empfehlen .
Wenn Sie alles in einem Ordner (einschließlich Unterordner) in ein bestimmtes Unterverzeichnis kopieren möchten:
cp -R $(ls | grep -v '^subdir$') subdir/
Funktioniert mit sh, bash, zsh (zumindest).
cp -R * subdir/
cp
(nicht von bash
/ sh
), " cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’
" zu vermeiden . Die Kopie wird jedoch korrekt abgeschlossen. Leider bricht Ihre Variante mit einem Dateinamen, der ein Leerzeichen oder eine Shell-sensitive Interpunktion enthält. Siehe unix.stackexchange.com/q/128985/135943
extglob
ist der beste Weg, soweit ich denke.
Ein anderer Weg ist die Verwendung
cp $(ls --ignore=x) subdir/
$
usw.) Analysieren Sie niemals die Ausgabe von ls
. unix.stackexchange.com/q/128985/135943