Zwischen diesen beiden Argumentationsformen besteht ein grundlegender Unterschied. Und es ist wichtig zu verstehen, was passiert.
Mit ../foldersource/.
das Argument wird unverändert an den Befehl übergeben, egal ob es cp
ist oder rm
oder etwas anderes. Es hängt vom Befehl ab, ob dieser abschließende Punkt eine spezielle oder eindeutige Semantik hat, die sich von der Standard-Unix-Konvention unterscheidet, einfach auf das Verzeichnis zu zeigen, in dem er sich befindet; beide rm
und cp
scheinen es als Sonderfall zu behandeln.
Mit ../foldersource/*
das Argument wird zunächst um die Shell before erweitert der Befehl wird überhaupt noch ausgeführt und irgendwelche Argumente übergeben. Also rm
sieht nie ../foldersource/*
; es sieht die erweiterte Version ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1
usw. Dies ist wichtig, da Betriebssysteme die Anzahl der Argumente begrenzen, die an einen Befehl übergeben werden können, normalerweise nur einige Hundert.
Beim Kopieren mit cp -a source/* target/
Sie kopieren die meisten Dateien und Verzeichnisse von source
bis target
. Insbesondere werden die ausgeschlossenen Elemente wahrscheinlich Dateien sein, die mit einem Punkt beginnen (.
) in der obersten Ebene von source
.
Betrachten Sie diese Dateien (oder Verzeichnisse) in source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will not be copied
Beim Kopieren mit cp -a source/. target/
Sie kopieren den gesamten Inhalt von source
, einschließlich aller Elemente, die mit einem Punkt beginnen (.
) bis target
Betrachten Sie diese Dateien (oder Verzeichnisse) in source
apple # will be copied
banana/ # will be copied, as will all its contents
.cherry # will be copied
Wenn Sie bash
verwenden , zsh
, können Sie den dotglob
verwenden Möglichkeit, die Bedeutung von *
zu ändern sodass es Dateien und Verzeichnisse enthält, die mit einem Punkt beginnen (yash
hat auch einen dotglob
Möglichkeit; allerdings enthält es dann .
und ..
in Glob-Erweiterungen, was die Verwendbarkeit einschränkt. Siehe auch FIGNORE='@(.|..)'
in ksh93
).
Interessanterweise cp -a source/. target/
garantiert nie um die Komponente target/source
zu erstellen . (Andererseits cp -a source target/
wird eines von zwei Dingen tun, je nachdem, ob target
oder nicht ist bereits vorhanden. Weitere Informationen finden Sie unter So kopieren Sie einen Ordner rekursiv auf idempotente Weise mit cp.)
Beim Löschen mit rm -rf source/*
Sie löschen die Dateien und Verzeichnisse in source
die nicht mit einem Punkt beginnen (.
). Vorbehaltlich des dotglob
Einstellung, die ich bereits erwähnt habe. Das Verzeichnis source
wird nicht gelöscht selbst.
Wenn Sie versuchen, mit rm -rf source/.
zu löschen es wird fehlschlagen - wie andere bereits erklärt haben - weil POSIX das Löschen eines Pfades verbietet, dessen letzte Komponente .
ist oder ..
. Das nächste Äquivalent ist rm -rf source
, wodurch source
gelöscht wird Verzeichnis und alle seine Inhalte, unabhängig davon, ob sie mit einem Punkt beginnen oder nicht (.
).
rm -rf ../foldersource/.
ist nicht möglich weil rm
erlaubt dies nicht, wie ausdrücklich im Handbuch angegeben:
Jeder Versuch, eine Datei zu entfernen, deren letzte Dateinamenskomponente „.“ oder „..“ ist, wird ohne Aufforderung abgelehnt, wie von POSIX vorgeschrieben.
und im POSIX-Handbuch man 1p rm
wir sehen:
Wenn eine der Dateien dot oder dot-dot als Basisnamensteil eines Operanden angegeben ist (d. h. die letzte Komponente des Pfadnamens) oder wenn ein Operand in das Stammverzeichnis aufgelöst wird, soll rm eine Diagnosenachricht in den Standardfehler schreiben und mit solchen Operanden nichts weiter tun .