当用户想要删除shell中的特定文件时发出警告提示

时间:2018-03-17 22:17:39

标签: linux bash shell

我必须制作一个基本的bash脚本,密切关注特定文件,如果我决定删除此文件,则会出现警告以确认删除。脚本应该接受一个参数(将在删除时检查的文件)如何实现此目的?我不明白如何在脚本运行时检查用户是否真的试图删除该文件。

任何提示都会非常感激

2 个答案:

答案 0 :(得分:1)

这是一个非常糟糕的主意。这种机制无论是有意还是无意地都是微不足道的(运行>file代替<file会删除其内容,就像删除内容一样多。 rm file确实 - 更确切地说,因为rm会留下其他硬链接,但是>file将清除与inode相关联的数据,无论有多少链接可能是)。如果这样做会阻止您保持良好的备份,部署自动快照或利用适当的文件权限,那么它的弊大于利。

请注意,相关的白名单是特定于shell的 - 如果您将文件添加到一个shell实例中的白名单中,则不一定会将其包含在另一个shell实例中。还要注意,实施是一个概念验证;它不会捕获标记为要保留的文件的父目录的递归删除。

# Put this in your ~/.bashrc

declare -A whitelisted_files

# If our default readlink isn't the GNU one, but we have GNU readlink installed
# as "greadlink", use it.
if command -v greadlink >/dev/null 2>&1; then
  readlink() { greadlink "$@"; }
fi

whitelist_file() {
  local arg
  for arg; do
    whitelisted_files["$(readlink -m -- "$arg")"]=1
  done
}

rm() {
  local arg sigil_seen=0 confirm
  for arg; do
    if (( sigil_seen == 0 )); then
      [[ $arg = -- ]] && { sigil_seen=1; continue; }
      [[ $arg = -* ]] && continue
    fi
    if [[ ${whitelisted_files["$(readlink -m -- "$arg")"]} ]]; then
      read -p "File $arg is whitelisted; really remove?" confirm
      [[ $confirm = [Yy]* ]] || return 1
    fi
  done
  command rm "$@"
}

此后:

touch preserve_me
whitelist_file preserve_me
rm preserve_me

...会提示:

File preserve_me is whitelisted; really remove?

答案 1 :(得分:0)

您可以将以下功能添加到.bashrc:

rem() {
  read -a files <<< $@
  for i in ${files[@]}; do
    if [[ $i == "1.txt" ]]; then
      rm -i $i
    else
      rm $i
    fi
  done
}

此处将1.txt替换为您要确认删除的文件名。然后将rm别名为此函数:

alias rm='rem'

如果用户运行命令rm 1.txt 2.txt,则只会删除2.txt并显示以下提示:rm: remove regular empty file '1.txt'?

备注:正如本答案的评论所述,函数rem无法正确处理带空格的文件名,以及其他问题,所以Charles Duffy的答案就是这样去吧。