web-dev-qa-db-ja.com

マウントポイントでない場合にのみディレクトリを安全に削除する

残念ながら、ネットワークボリュームの自動マウントとアンマウントを非常にうまく処理しないソフトウェアを使用せざるを得ません。マウントポイントがあったディレクトリを残すのは厄介な傾向がありますが、後でボリュームを再度マウントする場合は適切に対処できません(整理するのは想定ですが、多くの場合、そうではありません) )。

当然、私はそれを修正するために開発者のところにいますが、それまでの間、マウントポイントを自分で片付けるために何かをする必要があります。

したがって、基本的に私がする必要があるのはディレクトリを削除することですが、それがそうではない現在マウントポイントである場合に限ります(ボリュームの内容を誤って削除したくないため)。

これで、ディレクトリのデバイスIDを取得して、ルートのデバイスIDと簡単に比較できますが、このような比較を使用すると、競合状態になる可能性があります。つまり、デバイスIDのチェックの間にボリュームがマウントされている場合です。 rm -r /mnt/pointを呼び出します。

代替手段はありますか? findコマンドの-xdevオプションを使用する可能性に興味をそそられましたが、find /mnt/point -xdevは次のように機能しないため、実際に比較ポイントを提供する方法がわかりません。ターゲットとその内容は同じデバイスです。

また、一部のシステムではマウントポイントにファイルが含まれている可能性があるため、残りのフォルダが常に空であると想定してrmdirを使用することは信頼できないようです。たとえば、macOSは.autodiskmountedファイルを中に残します。私はcouldそのようなケースのリストを作成して処理しますが、そのようなことが可能であれば、将来の参照のために、より汎用的なソリューションがあると便利です(そしてうまくいけば他の人にも役立つでしょう)。

1
Haravikk

ディレクトリがマウントポイントの場合、ビジー状態になり、名前を変更できなくなります。

$ Sudo mv /mnt /mnt.old
mv: cannot move '/mnt' to '/mnt.old': Device or resource busy

通常のディレクトリの場合は、名前を変更できるはずです。

$ Sudo mv /mnt /mnt.old

移動が成功した場合は、マウントディレクトリを再作成し、名前を変更したディレクトリを削除します。オプションで、名前を変更したディレクトリが、削除する前に予期するファイルシステムの一部であることを検証できます。

4
BowlOfRed

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
1
sebasth

空でないディレクトリまたはマウントポイントであるディレクトリをrmdirすることはできません。したがって、これは要件を満たします。

rm -f mountpoint/.autodiskmounted    # MacOS cookie
rmdir mountpoint 2>/dev/null

エラー時に終了が設定されたスクリプトで実行している場合は、rmdir ... || trueを使用できます。 (マウントポイントを削除しようとするとキャッチされないエラーが発生するため、--ignore-fail-on-non-emptyはほとんど役に立たないことに注意してください。)

Macシステムにアクセスできないため、ファイルシステムが実際にマウントされているときに.autodiskmountedファイルが存在するかどうか、またはファイルシステムがマウント解除されているときのプレースホルダーであるかどうかをテストできないことを指摘しておく必要があります。

0
roaima