web-dev-qa-db-ja.com

ディレクトリが存在する場合、mkdir -pが失敗する

いずれかのリモートシステムで、ディレクトリが存在するときにmkdir -p $directoryが失敗します。それはそれが示すことを意味します

mkdir:ディレクトリ '$ directory'を作成できません:ファイルが存在します

-pの契約は、ディレクトリが既に存在する場合に常に成功すると信じていたため、これは本当に不可解です。そして、私が試した他のシステムでも動作します。

これらのすべてのシステムにユーザーtestdirectory=/home/test/tmpがいます。

24
UmNyobe

これは、ディレクトリに同じ名前のfileがすでに存在する場合に発生する可能性があります。

編集:Linuxマシンでは、ディレクトリに同じ名前のファイルとフォルダーの両方を含めることはできません。

33
Ryan Tse

$ directoryと同じ名前のファイル(ディレクトリではない)があるかどうかを確認します。

5
DWright

同じディレクトリに同じ名前のファイルが存在する場合、mkdir -pはディレクトリを作成しません。それ以外の場合は、期待どおりに機能します。

2
ASHU

あなたのディレクトリは、たぶん Fuse -basedネットワークマウントでしたか?

その名前がす​​でに存在するファイル(他の答え)に加えて、このディレクトリに何かをマウントすると、クラッシュしました(または、_kill -9_で、またはLinux OOMキラー経由で殺されました)。

詳細を確認するには、_strace -fy mkdir -p $directory_を実行します。これは、関連するすべてのsyscallとその戻り値を表示します。


この場合に出力されるエラーメッセージは_mkdir -p_(特にgnulibライブラリ)のバグだと考えています。

Fuseプロセスがマウントされているが、そのプロセスがクラッシュしたディレクトリで実行すると、

_mkdir: cannot create directory ‘/mymount’: File exists
_

基礎となるstat() 呼び出しはENOTCONN (Transport endpoint is not connected);を返すため、これはかなり不正確です。ただし、mkdirは、 前のmkdir() sycall から特定性の低いエラーを伝播します。 manページには次のように書かれているため、非常に混乱します。

_   -p, --parents
          no error if existing, make parent directories as needed
_

したがって、ディレクトリが存在する場合はエラーになりませんが、_ls -l /_は次を示します。

_d????????? ? ?    ?       ?            ? files
_

したがって、この(d)によれば、それディレクトリですが、_test -d_に従っていません。


私はより良いエラーメッセージ(この場合_mkdir -p_が出力するはずです)は次のようになると信じています:

_mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected
_
1
nh2