Diese Antwort zeigt, dass man alle Dateien - auch versteckte - wie folgt von Verzeichnis src
zu Verzeichnis kopieren kann dest
:
mkdir dest
cp -r src/. dest
Es gibt keine Erklärung in der Antwort oder ihren Kommentaren, warum dies tatsächlich funktioniert, und niemand scheint Dokumentation dazu zu finden.
Ich habe ein paar Dinge ausprobiert. Zunächst der Normalfall:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
Dann mit /.
am Ende:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
Das verhält sich also ähnlich *
, kopiert aber auch versteckte Dateien.
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.
und ..
sind richtige Hardlinks, wie hier erklärt , genau wie der Verzeichniseintrag selbst.
Woher kommt dieses Verhalten und wo ist es dokumentiert?
cp
Referenz erklärt klar, wie escp -R
funktioniert..
und..
Verzeichnisse sind genau wie alle anderen Verzeichnisse, es gibt nichts Magisches oder Geheimnisvolles an ihnen..
und..
nicht wie andere Verzeichnisse verhalten.Antworten:
Das Verhalten ist ein logisches Ergebnis des dokumentierten Algorithmus für
cp -R
. Siehe POSIX , Schritt 2f:.
und..
sind Verzeichnisse bzw. das aktuelle Verzeichnis und das übergeordnete Verzeichnis. Für die Shell ist beides nicht besonders, daher ist beides nicht von der Erweiterung betroffen, und das Verzeichnis wird einschließlich versteckter Dateien kopiert.*
Auf der anderen Seite wird es zu einer Liste von Dateien erweitert, und hier werden versteckte Dateien herausgefiltert.src/.
ist das aktuelle Verzeichnis insrc
dem essrc
sich befindet;src/src_dir/..
istsrc_dir
das übergeordnete Verzeichnis vonsrc
. Also von außensrc
, wennsrc
ein Verzeichnis ist , Angabesrc/.
odersrc/src_dir/..
als Quelldatei fürcp
gleichwertig sind, und kopieren Sie den Inhaltsrc
, einschließlich versteckte Dateien.Der Punkt der Angabe
src/.
ist, dass es fehlschlagen wird, wennsrc
es sich nicht um ein Verzeichnis (oder eine symbolische Verknüpfung zu einem Verzeichnis) handelt, wohingegensrc
dies nicht der Fall ist . Es kopiert auch nur den Inhalt vonsrc
, ohne sichsrc
selbst zu kopieren . das passt auch zur Dokumentation:So
cp -R src/. dest
kopiert den Inhalt dessrc
zudest/.
(die Quelldatei.
insrc
), währendcp -R src dest
kopiert den Inhalt dessrc
zudest/src
(die Quelldateisrc
).Eine andere Möglichkeit, sich das vorzustellen, besteht darin, das Kopieren
src/src_dir
undsrc/.
nicht das Vergleichensrc/.
und zu vergleichensrc
..
verhält sich genauso wiesrc_dir
im ersteren Fall.quelle
src
des Verzeichnisses in kopiertdest
,src/.
wird der Inhalt kopieren. Ich werde versuchen, das in der Frage klarer zu machen.src/.
undsrc/*
(; beachte, nichtsrc/.*
);src/*
Enthält keine versteckten Dateien, wenn Globbing sie ignoriert ...src
enthält,src/.
aber es bedeutet, dass das enthaltende Verzeichnis eines Verzeichnisses davon abhängt, wie Sie das Verzeichnis benennen. Natürlich bedeutet das Vorhandensein der.
Links in gewisser Weise, dass alle Verzeichnisse sich selbst enthalten, aber das ist möglicherweise nicht für alle intuitiv. Anstelle dieses Verhaltens könnte man auch davon ausgehen, dass "das Verzeichnis, das das Verzeichnis enthältfoo
" bestimmt wirdfoo/..
. In diesem Fall spielt es keine Rolle, ob wir auffoo
oder verweisenfoo/.
: Das resultierende enthaltende Verzeichnis wäre dasselbe.foo
undfoo/.
scheint ein bisschen heikel, aber es macht mir nichts aus, ich finde es auch etwas amüsant.Wenn du rennst
cp -R src/foo dest
, wirst du bekommendest/foo
. Wenn das Verzeichnisdest/foo
nicht vorhanden ist,cp
wird es erstellt und anschließend der Inhalt vonsrc/foo
nach kopiertdest/foo
.Wenn du rennst
cp -R src/. dest
, siehst du ,cp
dassdest/.
es das gibt, und dann geht es nur darum, den Inhalt vonsrc/.
to zu kopierendest/.
.Wenn Sie denken , es als ein Verzeichnis kopiert Namen
.
vonsrc
und dessen Inhalt mit dem bestehenden Verzeichnis verschmelzendendest/.
, wird es Sinn machen.quelle