Um Inhalte aus einem Ordner zu kopieren, den ich gelesen habe, verwenden Sie:
cp -rfva ../foldersource/. ./
aber das funktioniert auch
cp -rfva ../foldersource/* ./
Gibt es einen Unterschied?
Zum Beispiel, wenn ich einen Inhalt aus einem Ordner mit löschen möchte. ::
rm -rf ../foldersource/.
Ich bekomme den Fehler:
rm: rejet delete folder '.' or '..':
aber mit Sternchen ist ok
rm -rf ../foldersource/*
Sternchen ist also eine bessere Option, die überall funktioniert?
It's up to the command whether that trailing dot makes any sense
Ähm, der Punkt ist immer mit dem enthaltenen Verzeichnis selbst verknüpft,../foldersource/.
sollte sich also nicht von der Angabe unterscheiden./foldersource/
und ist in der Tat nur eine redundante Möglichkeit, dasselbe anzugeben. Kein Befehl versucht, einen Punkt oder einen Doppelpunkt zu "verstehen", da diese unter Linux / Unix-Dateisystemen Standard sind.rm
lehnt es einfach ab, das aktuelle Arbeitsverzeichnis zu entfernen, wiejimmij
in der Antwort angegeben. Beachten Sie außerdem, dass Sie./
in all Ihren Beispielen OP verwenden../
. Ein etwas großer Unterschied.cp -rfva ../foldersource/. ./
ist NICHT gleichbedeutend mitcp -rfva ../foldersource ./
. Das Nachlaufen/.
ist signifikant.
ist eine Standardkonvention in Unix, um den Strom direkt zu bezeichnen. Vielen Dank auch für den Hinweis, dass ich./
in meinen Beispielen verwendet habe, wann ich hätte verwenden sollen../
; Ich werde das beheben. Sie sind sich nicht sicher, ob Befehle für den nachfolgenden Punkt "sinnvoll" sind. wie das OPcp
beide hervorhebt (und mit beiden erlebt habe )rm
undcp
sich anders verhalten, wenn ein Trailing.
vorhanden ist. Ich hätte etwas schreiben sollen wie "Es liegt am Befehl, ob der nachfolgende Punkt eine spezielle oder eindeutige Semantik hat". Ich werde meine Antwort aus Gründen der Klarheit ändern.Wenn Sie mit kopieren, kopieren
cp -a source/* target/
Sie die meisten Dateien und Verzeichnisse vonsource
nachtarget
. Insbesondere handelt es sich bei den ausgeschlossenen Elementen wahrscheinlich um Dateien, die mit einem Punkt (.
) in der obersten Ebene von beginnensource
.Betrachten Sie diese Dateien (oder Verzeichnisse) in
source
Wenn Sie mit kopieren,
cp -a source/. target/
kopieren Sie den gesamten Inhalt vonsource
, einschließlich aller Elemente, die mit einem Punkt (.
) beginnen, nachtarget
Betrachten Sie diese Dateien (oder Verzeichnisse) in
source
Wenn Sie verwenden
bash
,zsh
können Sie die verwendendotglob
Option , die Bedeutung zu ändern ,*
so dass sie beginnen , Dateien und Verzeichnisse mit einem Punkt enthält (yash
hat auch einedotglob
Option, aber es schließt dann.
und..
. In glob Erweiterungen , die ihre Verwendbarkeit einschränkt Siehe auchFIGNORE='@(.|..)'
inksh93
).Interessanterweise
cp -a source/. target/
wird garantiert nie die Komponente erstellttarget/source
. (Auf der anderen Seitecp -a source target/
wird eines von zwei Dingen ausgeführt, je nachdem, ob estarget
bereits vorhanden ist oder nicht . Weitere Informationen finden Sie unter Kopieren eines Ordners auf idempotente Weise mit cp .)Wenn Sie mit löschen, löschen
rm -rf source/*
Sie die Dateien und Verzeichnissesource
, die nicht mit einem Punkt (.
) beginnen. Vorbehaltlich derdotglob
bereits erwähnten Einstellung. Das Verzeichnissource
selbst wird nicht gelöscht .Wenn Sie versuchen, mit zu löschen, schlägt
rm -rf source/.
dies fehl - wie andere bereits erklärt haben -, da POSIX das Löschen eines Pfads verbietet, dessen letzte Komponente.
oder ist..
. Das nächste Äquivalent istrm -rf source
, das dassource
Verzeichnis und seinen gesamten Inhalt löscht, unabhängig davon, ob sie mit einem Punkt (.
) beginnen oder nicht .quelle
rm -rf .
Scheitern .Sie können dies nicht tun,
rm -rf ../foldersource/.
darm
dies nicht zulässig ist, wie im Handbuch ausdrücklich angegeben:und im POSIX-Handbuch sehen
man 1p rm
wir:quelle