34

mkdir -p $directoryディレクトリが存在する場合、リモートシステムの1つで障害が発生します。それはそれが示すことを意味します

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

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

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

4

4 に答える 4

47

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

Linuxマシンでは、ディレクトリに同じ名前のファイルとフォルダの両方を含めることはできないことに注意してください。

于 2013-01-24T08:33:34.737 に答える
4

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

于 2013-01-24T08:35:09.603 に答える
3

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

于 2013-01-24T14:30:19.687 に答える
3

あなたのディレクトリはたまたまFUSEベースのネットワークマウントでしたか?

その名前のファイルがすでに存在している(他の回答)ことに加えて、これは、このディレクトリに何かをマウントしたFUSEプロセスがクラッシュした(または、Linux OOMキラーを使用してまたは経由して強制終了された)場合に発生する可能性がありますkill -9

何が起こっているかを詳細に確認するには、を実行しますstrace -fy mkdir -p $directory。これにより、関連するすべてのシステムコールとその戻り値が表示されます。


この場合に発生するエラーメッセージはmkdir -p(特にgnulibライブラリ)のバグだと思います。

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

mkdir: cannot create directory ‘/mymount’: File exists

基になるstat()ENOTCONN (Transport endpoint is not connected)呼び出しが;を返すため、これはかなり不正確です。ただし、前のsycallmkdirからのあまり具体的でないエラーを伝播します。マニュアルページには次のように書かれているので、さらに混乱します。mkdir()

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

したがって、dirが存在してもエラーにはならないはずですが、次のようにls -l /表示されます。

d????????? ? ?    ?       ?            ? files

したがって、これ(d)によると、これディレクトリですが、によるとではありませんtest -d


より良いエラーメッセージ(mkdir -pこの場合は出力されるはずです)は次のようになると思います。

mkdir: cannot create directory ‘/mymount’: Transport endpoint is not connected
于 2018-12-14T20:29:34.890 に答える