BASH - 跑步前的安全检查" rm -fr $ FOLDER"

时间:2017-02-09 03:27:47

标签: bash rm

我有一个真正需要特定文件夹上的rm -fr的脚本

我希望尽可能安全。我在下面开始编写这个脚本,但我想知道是否还有其他错过的内容。

folder=""

if [[ ! -d "$folder" ]]; then
  echo "Error: is not a folder"
elif [[ "$folder" == "/" ]]; then
  echo "Error: folder points to root"
elif [[ "$folder" == "../"* ]]; then
  echo "Error: folder start with ../"
elif [[ "$folder" == *"/.."* ]]; then
  echo "Error: folder contains /.."
elif [[ "$folder" == *"/*"* ]]; then
  echo "Error: folder ends with /*"
else
  rm -fr "$folder"
fi

更新:添加了检查" /"

2 个答案:

答案 0 :(得分:0)

如果你想尽可能安全,你或许......

确保首先完成任何通配:

shopt -s nullglob
declare -a folders=(folder_or_glob)

迭代遍历数组的每个元素,一次一个,并在规范路径上运行。

for f in "${folders[@]-}"
do
  [[ $f ]] || continue
  candidate="$(realpath -e -s "$f")" || continue
  ok_to_delete "$candidate" || continue
  rm -rf "$candidate"
done

使用函数ok_to_delete来测试:

ok_to_delete()
{
  [[ -d $1 ]] || continue     # Is directory
  [[ $1 != / ]] || continue   # Not root
  [[ "${1%/*}" ]] || continue # At least two levels deep
  (... add any test you want ...)
}

这里有一些冗余(例如,根目录不是root + 2级),但这只是为了给你提供想法。

答案 1 :(得分:0)

我不想检查文件夹的路径名,而是检查该文件夹中的内容,文件的大小/用户/时间戳/键/扩展等,或者您最关心的内容。这对你来说是一种更安全的方法,这只是我的两分钱。