Könnte jemand erklären, warum dies passiert?
Ganz konkret: Warum wird der Inhalt einer 1 nach f kopiert? Und warum wird f nach g kopiert?
$ tree
.
0 directories, 0 files
$ mkdir 1
$ mkdir 2
$ touch 1/a
$ touch 1/b
$ mkdir 1/c
$ touch 1/c/x
$ tree
.
├── 1
│ ├── a
│ ├── b
│ └── c
│ └── x
└── 2
3 directories, 3 files
$ cp -r 1/* 2/*
zsh: no matches found: 2/*
$ cp -r 1/* 2/*
$ mkdir 2/f
$ mkdir 2/g
$ cp -r 1/* 2/*
$ tree
.
├── 1
│ ├── a
│ ├── b
│ └── c
│ └── x
└── 2
├── f
└── g
├── a
├── b
├── c
│ └── x
└── f
7 directories, 6 files
cp -r 1/* 2/*
drin - es wird zweimal hintereinander mit (anscheinend) unterschiedlichen Ergebnissen durchgeführt. Es sollte sich immer darüber beschweren, dass es keinen findet,2/*
weil die Shell diesen Glob nicht erweitern kann - nichts passt dazu. Und der Inhalt von1
wirdf
in diesem Beispiel nicht kopiert .cp
eindeutig ist, können Sie es versuchen--target-directory
, z. B.cp --target-directory=2 fileglob1 fileglob2
finde ich diese Option sehr nützlich in Skripten, in denen ich nicht sicher bin, welche Globs funktionieren und welche nicht. Es hilft, versehentliches Überschreiben zu verhindern. (Einige Versionencp
erlauben-t
.)Antworten:
Für
cp
ist das Ziel das letzte Argument auf der Kommandozeile. Sie haben2/g
als letztes Argument angegeben.Bevor
cp
ausgeführt wird, werden die Befehlsparameter erweitert.1/*
erweitert sich auf1/a 1/b 1/c
.2/*
erweitert sich auf2/f 2/g
. Der letzte ausgeführte Befehl istcp -r 1/a 1/b 1/c 2/f 2/g
, der alle Argumente (außer dem letzten) nach kopiert2/g
.Wenn Sie beabsichtigen, Dinge zu kopieren,
2
ist der zweite Glob nicht erforderlich, um den Befehl auszuführencp -r 1/* 2/
. Wenn Sie beabsichtigen, Dinge an mehrere Ziele zu kopieren, können Sie dies nicht mit just angebencp
. Sie können eine kleine Schleife wie die folgende verwenden:quelle