GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Unterschied kopieren Inhaltsordner zwischen /. und /* unter Linux

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 .


Linux
  1. Was ist der Unterschied zwischen Suspend und Hibernate in Linux?

  2. Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

  3. Linux – Unterschied zwischen User Space und Kernel Space?

  4. Linux – Unterschied zwischen Pts und Tty?

  5. Was ist der Unterschied zwischen „locate“ und „find“ in Linux?

Kopieren Sie Dateien zwischen Linux und FreeDOS

Lernen Sie den Unterschied zwischen den Befehlen „su“ und „su -“ in Linux kennen

Verstehen des Unterschieds zwischen dem Befehl sudo und su unter Linux

Was ist der Unterschied zwischen macOS- und Linux-Kernels

Was ist der Unterschied zwischen Linux und Unix?

unterschied zwischen netstat und ss unter linux?