it-swarm.com.de

mkdir -p schlägt fehl, wenn das Verzeichnis existiert

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.

22
UmNyobe

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.

31
Ryan Tse

Prüfen Sie, ob es eine Datei (kein Verzeichnis) gibt, deren Name mit dem Verzeichnis $ identisch ist.

5
DWright

mkdir -p erstellt kein Verzeichnis, wenn eine Datei mit demselben Namen in demselben Verzeichnis vorhanden ist. Ansonsten funktioniert es wie erwartet.

2
ASHU

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
0
nh2