Auf einem unserer Remote-Systeme schlägt mkdir -p $directory
fehl, wenn das Verzeichnis vorhanden ist. was bedeutet es zeigt
mkdir: Verzeichnis '$ directory' kann nicht erstellt werden: Datei existiert
Das ist wirklich rätselhaft, da ich der Meinung war, dass der Vertrag von -p
war, der immer erfolgreich ist, wenn das Verzeichnis bereits existiert. Und es funktioniert auf den anderen Systemen, die ich ausprobiert habe.
auf allen diesen Systemen gibt es einen Benutzer test
und directory=/home/test/tmp
.
Dies kann verursacht werden, wenn sich bereits eine Datei mit demselben Namen im Verzeichnis befindet.
Bearbeiten: Beachten Sie, dass ein Verzeichnis auf Linux-Maschinen nicht gleichzeitig eine Datei und einen Ordner mit demselben Namen enthalten kann.
Prüfen Sie, ob es eine Datei (kein Verzeichnis) gibt, deren Name mit dem Verzeichnis $ identisch ist.
mkdir -p erstellt kein Verzeichnis, wenn eine Datei mit demselben Namen in demselben Verzeichnis vorhanden ist. Ansonsten funktioniert es wie erwartet.
War Ihr Verzeichnis zufällig ein Fuse - basiertes Netzwerk - Mount?
Neben einer -Datei mit diesem Namen (andere Antwort) kann dies auch passieren, wenn ein Fuse-Prozess, der einmal etwas in diesem Verzeichnis eingebunden hatte, abstürzte (oder getötet wurde, zB mit kill -9
oder über Linux) OOM-Mörder).
Führen Sie strace -fy mkdir -p $directory
aus, um alle beteiligten Systemaufrufe und ihre Rückgabewerte anzuzeigen.
Ich betrachte die Fehlermeldungen, die in diesem Fall ausgegeben wurden, als Fehler in mkdir -p
(insbesondere in der gnulib
-Bibliothek):
Wenn Sie es in einem Verzeichnis ausführen, in dem ein Fuse-Prozess installiert war, der jedoch abgestürzt ist, heißt es
mkdir: cannot create directory ‘/mymount’: File exists
was ziemlich ungenau ist, weil der zugrunde liegende stat()
call ENOTCONN (Transport endpoint is not connected)
zurückgibt; mkdir
verbreitet jedoch den weniger spezifischen Fehler von der vorherigen mkdir()
sycall . Dies ist besonders verwirrend, da die Manpage Folgendes sagt:
-p, --parents
no error if existing, make parent directories as needed
es sollte also kein Fehler auftreten, wenn das Verzeichnis existiert, aber ls -l /
zeigt:
d????????? ? ? ? ? ? files
entsprechend diesem (d
) ist es is ein Verzeichnis, aber es entspricht nicht test -d
.
Ich glaube, eine bessere Fehlermeldung (die mkdir -p
in diesem Fall ausgeben soll) wäre:
mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected