
$ mv . ../general/
mv: cannot move `.' to `../general/.': Device or resource busy
Bedeutet dies, dass das aktuelle Verzeichnis ein belegtes Gerät oder eine belegte Ressource ist und nicht verschoben werden kann? Warum ist das so?
Antwort1
Sie können das Verzeichnis, in dem Sie sich aktuell befinden, nicht verschieben. Es ist der aktuelle Prozess, der es beschäftigt.
Gehen Sie stattdessen eine Ebene nach oben und benennen Sie das zuvor aktuelle Verzeichnis, um es zum Ziel zu verschieben.
Antwort2
Es ist nicht möglich, einen Punkt zu verschieben .
. Der Punkt ist nicht dasselbe wie der aktuelle Verzeichnisname. Man kann ihn sich .
als Zeiger auf das Verzeichnis vorstellen, aber nicht als das Verzeichnis selbst.
$ pwd && echo $PWD && realpath .
/home/jimmij/tmp
/home/jimmij/tmp
/home/jimmij/tmp
$ mkdir tmp1 tmp2
$ mv tmp1/. tmp2/
mv: cannot move ‘tmp1/.’ to ‘tmp2/.’: Device or resource busy
funktioniert nicht, aber
cd tmp1
mv ../tmp1 ../tmp2
funktioniert gut, also eigentlich Siedürfenaktuelles Verzeichnis verschieben, obwohl einige Befehle nach dieser Operation verwirrend sein können:
$ pwd && echo $PWD && realpath .
/home/jimmij/tmp/tmp1
/home/jimmij/tmp/tmp1
/home/jimmij/tmp/tmp2/tmp1
$ cd .
$ pwd && echo $PWD && realpath .
/home/jimmij/tmp/tmp2/tmp1
/home/jimmij/tmp/tmp2/tmp1
/home/jimmij/tmp/tmp2/tmp1
Ähnliches gilt für ..
das übergeordnete Verzeichnis.
Mit anderen Worten: Jedes Verzeichnis muss mindestens zwei Elemente enthalten: .
und ..
. Sie können sie weder verschieben noch löschen.
Antwort3
Der Grund, warum Sie die Nachricht erhalten:
mv: kann nicht verschoben werden
.' to
. ../general/.': Gerät oder Ressource beschäftigt
liegt daran, wie .
und ..
zusätzlich zu funktionieren mv
. Wenn Sie in Unix etwas verschieben, mv
versucht der Befehl, alle Verknüpfungen aufzuheben, die auf den Inode des Elements verweisen, das Sie verschieben möchten. In diesem Fall wäre das der Inode des Verzeichnisses, auf das .
verwiesen wird.
Die „Symbole/Links“ .
verweisen ..
auf Inodes und sind in gewisser Weise etwas Besonderes. Sie können hier in den U&L-Fragen und -Antworten etwas über ihre Geschichte lesen:Warum hat ein neues Verzeichnis eine Hardlink-Anzahl von 2, bevor ihm etwas hinzugefügt wird?Wenn Sie sich schon einmal ein neu erstelltes Verzeichnis angesehen haben, werden Sie feststellen, dass es immer mit einer verknüpften Anzahl von 2 beginnt. Der Grund liegt in der Existenz von .
und ..
.
$ mkdir adir
$ ls -l | grep adir
drwxrwxr-x. 2 saml saml 4096 Oct 5 08:02 adir
$ ls -la adir/
total 8
drwxrwxr-x. 2 saml saml 4096 Oct 5 08:02 .
drwxrwxr-x. 3 saml saml 4096 Oct 5 08:02 ..
NOTIZ:Bei ls
Unklarheiten finden Sie hier in diesem U&L Q&A mit dem Titel:Was bedeuten die Felder in der ls -al-Ausgabe?
Es handelt sich also nicht um Namen tatsächlicher Verzeichnisse, sondern um „Symbole/Links“, die auf diese verweisen. Daher muss die Verknüpfung aufgehoben werden, bevor sie verwendet werden kann mv
.
Da Ihr Befehl das verwendet .
, kann die Verknüpfung durch den mv
Befehl nicht aufgehoben werden. Daher die Meldung: „Gerät oder Ressource beschäftigt“.
Verweise
Antwort4
Linux untersagt das Umbenennen von Pfaden, die mit der Komponente .
oder enden ..
, und gibt den Fehler EBUSY zurück. Folgendes schlägt ebenfalls fehl:
$ mkdir a a/aa
$ mv a/aa/.. b
mv: cannot move ‘a/aa/..’ to ‘b/..’: Device or resource busy
Der Code hierfür befindet sich in namei.c::renameat
. Die letzte Komponente des Pfadnamens muss bei der Übergabe an verschiedene Funktionen vom Typ sein LAST_NORM
, nicht vom Typ LAST_DOT
oder LAST_DOTDOT
.
FreeBSD gibt in jedem dieser Fälle den Fehler EINVAL zurück.
Über den Grund dieser Einschränkung können wir nur spekulieren.
- DerPOSIX-Standard zum Umbenennenbesagt, dass
Die Funktion rename() schlägt fehl, wenn:
…
[EBUSY] Das mit „old“ oder „new“ benannte Verzeichnis wird derzeit vom System oder einem anderen Prozess verwendet und die Implementierung wertet dies als Fehler.
Man könnte davon ausgehen, .
dass das Verzeichnis derzeit vom Prozess verwendet wird. Beachten Sie jedoch, dass Linux Folgendes zulässt. Die bloße Verwendung eines Verzeichnisses durch einen Prozess reicht also nicht aus, um rename
einen Fehler zu verursachen:
$ mkdir /tmp/t
$ cd /tmp/t
$ mv /tmp/t /tmp/t1
$ /bin/pwd
/tmp/t1
Der Grund für das Verbot der Umbenennung von .
und ..
ist wahrscheinlich, dass es „zu weniger Verwirrung bei den Benutzern führt“.
.
ist normalerweise ein Hardlink zum Verzeichniseintrag im übergeordneten Verzeichnis und hat die Besonderheit, dass ein Prozess immer auf.
sein aktuelles Arbeitsverzeichnis zugreifen kann. Die Möglichkeit, es umzubenennen, wäre kontraproduktiv...
ist normalerweise ein Hardlink zum übergeordneten Verzeichnis und ist insofern etwas Besonderes, als dass ein öffnender Prozess..
das übergeordnete Verzeichnis erhält (oder das Verzeichnis selbst, wenn es ein Einhängepunkt ist). Die Möglichkeit, es umzubenennen, wäre kontraproduktiv.
Linux verbietet auch rmdir
Pfade, deren letzte Komponente ..
(ENOTEMPTY) oder .
(EINVAL) ist. FreeBSD gibt für beide den Fehler EINVAL zurück. DerPOSIX-Standard für rmdirhat dies:
Die Funktion rmdir() schlägt fehl, wenn:
…
[EINVAL] Das Pfadargument enthält als letzte Komponente einen Punkt.