いずれかのリモートシステムで、ディレクトリが存在するときにmkdir -p $directory
が失敗します。それはそれが示すことを意味します
mkdir:ディレクトリ '$ directory'を作成できません:ファイルが存在します
-p
の契約は、ディレクトリが既に存在する場合に常に成功すると信じていたため、これは本当に不可解です。そして、私が試した他のシステムでも動作します。
これらのすべてのシステムにユーザーtest
とdirectory=/home/test/tmp
がいます。
これは、ディレクトリに同じ名前のfileがすでに存在する場合に発生する可能性があります。
編集:Linuxマシンでは、ディレクトリに同じ名前のファイルとフォルダーの両方を含めることはできません。
$ directoryと同じ名前のファイル(ディレクトリではない)があるかどうかを確認します。
同じディレクトリに同じ名前のファイルが存在する場合、mkdir -pはディレクトリを作成しません。それ以外の場合は、期待どおりに機能します。
あなたのディレクトリは、たぶん 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
_