我必须制作一个基本的bash脚本,密切关注特定文件,如果我决定删除此文件,则会出现警告以确认删除。脚本应该接受一个参数(将在删除时检查的文件)如何实现此目的?我不明白如何在脚本运行时检查用户是否真的试图删除该文件。
任何提示都会非常感激
答案 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的答案就是这样去吧。