この質問は、* nix でディレクトリを空にする最も安全な方法は何ですか? に似ています。
いくつかのパス定数を定義し、それらをファイルとディレクトリの操作 (コピー、名前変更、削除) に使用する bash スクリプトを作成しています。多くの場合、次のようなことを行う必要があります。
rm -rf "/${PATH1}"
rm -rf "${PATH2}/"*
このスクリプトを開発している間、PATH1 や PATH2 などの名前の入力ミスを防ぎ、それらが空の文字列に展開されてディスク全体が消去される状況を回避したいと考えています。特別なラッパーを作成することにしました:
rmrf() {
if [[ $1 =~ "regex" ]]; then
echo "Ignoring possibly unsafe path ${1}"
exit 1
fi
shopt -s dotglob
rm -rf -- $1
shopt -u dotglob
}
次のように呼び出されます。
rmrf "/${PATH1}"
rmrf "${PATH2}/"*
正規表現 (または sed 式) は、「*」、「/*」、「/**/」、「///*」などのパスをキャッチする必要がありますが、「dir」、「/dir」、「/dir1」などのパスは許可します。 /dir2/"、"/dir1/dir2/*". また、「/dir with space/*」のような場合にシェルのグロブを有効にする方法もわかりません。何か案は?
編集:これは私がこれまでに思いついたものです:
rmrf() {
local RES
local RMPATH="${1}"
SAFE=$(echo "${RMPATH}" | sed -r 's:^((\.?\*+/+)+.*|(/+\.?\*+)+.*|[\.\*/]+|.*/\.\*+)$::g')
if [ -z "${SAFE}" ]; then
echo "ERROR! Unsafe deletion of ${RMPATH}"
return 1
fi
shopt -s dotglob
if [ '*' == "${RMPATH: -1}" ]; then
echo rm -rf -- "${RMPATH/%\*/}"*
RES=$?
else
echo rm -rf -- "${RMPATH}"
RES=$?
fi
shopt -u dotglob
return $RES
}
使用目的は次のとおりです (引用符内のアスタリスクに注意してください):
rmrf "${SOMEPATH}"
rmrf "${SOMEPATH}/*"
$SOMEPATH はシステムまたは /home ディレクトリではありません (私の場合、そのような操作はすべて /scratch ディレクトリの下にマウントされたファイルシステムで実行されます)。
警告:
- あまりよくテストされていません
- 「..」または「.」を含む可能性のあるパスでの使用は意図されていません。
- ユーザー指定のパスでは使用しないでください
- $SOMEPATH 内にファイルまたはディレクトリが多すぎる場合、アスタリスク付きの rm -rf はおそらく失敗する可能性があります (コマンド ラインの長さが限られているため)。これは、'for' ループまたは 'find' コマンドで修正できます。