Es ist die Shell, die Platzhalter erweitert, nicht die Befehle. Erweitert also cp dir1/* dir2/*
zuerst die beiden Platzhalter und ruft dann cp
das Ergebnis auf. Dies ist anscheinend überhaupt nicht das, was Sie anscheinend erwarten: Je nachdem, wie viele Dateien bereits vorhanden sind dir2
, dir2/*
kann dies zu einem oder mehreren Argumenten führen. Der Befehl cp
weiß nicht, welches seiner Argumente aus der Erweiterung des ersten Musters und welches aus der Erweiterung des zweiten Musters stammt. Es wird erwartet, dass das letzte Argument der Name des Zielverzeichnisses ist. Um alle Dateien aus dem Verzeichnis dir1
in das Verzeichnis zu kopieren dir2
, muss das letzte Argument das Verzeichnis sein dir2
:
cp dir1/* dir2
Da *
alle Dateien übereinstimmen, wird cp
versucht, alle Dateien zu kopieren. Dies schließt Verzeichnisse ein: Verzeichnisse sind auch Dateien. Verzeichnisse werden übersprungen, es wird jedoch ein Fehler gemeldet. Es kopiert den Inhalt spezieller Dateien wie Named Pipes (etwas sollte besser in sie geschrieben werden oder cp
blockiert) usw.
Um nur reguläre Dateien zu kopieren , müssen Sie den Abgleich einschränken. In zsh können Sie dafür das Glob-Qualifikationsmerkmal verwenden .
:
cp dir1/*(.) dir2
Andere Muscheln haben das nicht. Mit dem find
Befehl können Sie nach Dateitypen filtern. Angenommen, Sie verwenden nicht eingebettetes Linux oder Cygwin:
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
Unter Linux, FreeBSD und OSX:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2