残念ながら、ネットワークボリュームの自動マウントとアンマウントを非常にうまく処理しないソフトウェアを使用せざるを得ません。マウントポイントがあったディレクトリを残すのは厄介な傾向がありますが、後でボリュームを再度マウントする場合は適切に対処できません(整理するのは想定ですが、多くの場合、そうではありません) )。
当然、私はそれを修正するために開発者のところにいますが、それまでの間、マウントポイントを自分で片付けるために何かをする必要があります。
したがって、基本的に私がする必要があるのはディレクトリを削除することですが、それがそうではない現在マウントポイントである場合に限ります(ボリュームの内容を誤って削除したくないため)。
これで、ディレクトリのデバイスIDを取得して、ルートのデバイスIDと簡単に比較できますが、このような比較を使用すると、競合状態になる可能性があります。つまり、デバイスIDのチェックの間にボリュームがマウントされている場合です。 rm -r /mnt/point
を呼び出します。
代替手段はありますか? find
コマンドの-xdev
オプションを使用する可能性に興味をそそられましたが、find /mnt/point -xdev
は次のように機能しないため、実際に比較ポイントを提供する方法がわかりません。ターゲットとその内容は同じデバイスです。
また、一部のシステムではマウントポイントにファイルが含まれている可能性があるため、残りのフォルダが常に空であると想定してrmdir
を使用することは信頼できないようです。たとえば、macOSは.autodiskmounted
ファイルを中に残します。私はcouldそのようなケースのリストを作成して処理しますが、そのようなことが可能であれば、将来の参照のために、より汎用的なソリューションがあると便利です(そしてうまくいけば他の人にも役立つでしょう)。
ディレクトリがマウントポイントの場合、ビジー状態になり、名前を変更できなくなります。
$ Sudo mv /mnt /mnt.old
mv: cannot move '/mnt' to '/mnt.old': Device or resource busy
通常のディレクトリの場合は、名前を変更できるはずです。
$ Sudo mv /mnt /mnt.old
移動が成功した場合は、マウントディレクトリを再作成し、名前を変更したディレクトリを削除します。オプションで、名前を変更したディレクトリが、削除する前に予期するファイルシステムの一部であることを検証できます。
Linuxを使用している場合
mountpoint
を使用して、ディレクトリがマウントポイントであるかどうかをテストできます。
テストとrm -r
の間にマウントポイントが表示/非表示にならないようにするには、別の マウント名前空間 でスクリプトを実行する必要があります。 private subtree を使用(マウントは新しい名前空間との間で伝播しません)。これは、 unshare
で実行できます。
unshare -m --propagation private -- "<delete script>"
同じスクリプト内のすべて:
#!/bin/sh
unshare -m --propagation private -- sh -e <<EOF
if ! mountpoint -q "<path>"; then
rm -r "<path>"
fi
EOF
空でないディレクトリまたはマウントポイントであるディレクトリをrmdir
することはできません。したがって、これは要件を満たします。
rm -f mountpoint/.autodiskmounted # MacOS cookie
rmdir mountpoint 2>/dev/null
エラー時に終了が設定されたスクリプトで実行している場合は、rmdir ... || true
を使用できます。 (マウントポイントを削除しようとするとキャッチされないエラーが発生するため、--ignore-fail-on-non-empty
はほとんど役に立たないことに注意してください。)
Macシステムにアクセスできないため、ファイルシステムが実際にマウントされているときに.autodiskmounted
ファイルが存在するかどうか、またはファイルシステムがマウント解除されているときのプレースホルダーであるかどうかをテストできないことを指摘しておく必要があります。