rm 选项在文件不存在时失败

rm 选项在文件不存在时失败

GNU coreutils 8.12.197-032bbman的页面将或选项描述为“忽略不存在的文件,从不提示”。如果没有此选项,它将删除任何现有文件,从不提示,并且如果任何指定文件不存在,则返回非零退出代码。我想rm-f--force保留文件,如果任何指定的文件不存在。做到这一点最简单的方法是什么?

用例是安全:如果我尝试删除不存在的文件,可能是因为命令中存在无效的期望(或简单的错误)。例如有名的rm -rf /usr /lib/nvidia-current/xorg/xorg可以通过多种方式避免,其中之一是这样的选项(显然,除非用户出于某种令人难以置信的巧合拥有一个/lib/nvidia-current/xorg/xorg目录),另一个是使用更多报价™。然而,引用并不总是足够的。例如,考虑一下ssh host '/bin/rm some paths; /bin/bash foo.sh'- 如果我忘记了分号或插入了几乎任何其他符号(如冒号或逗号),它会尝试删除/bin/bashand ~/foo.sh

答案1

我用这样的东西:

mkdir DELETE && mv "some" "paths" DELETE && rm -rf DELETE

对于单个路径:

mv /some/path DELETE && rm -rf DELETE

rm command更好的是,在单独的命令行上键入: mv /some/path DELETE Enter rm -rf DELETE Enter。这样,rm进入 shell 历史记录的唯一命令是名为 的文件DELETE,因此,如果您删除了某个文件的旧版本,则不会因为意外按了Up错误的次数而删除了新版本Enter

如果你想自动化一点:

mv_to_DELETE () {
  mkdir DELETE &&
  mv -- "$@" DELETE/
}
mv_to_DELETE "some" "paths"
rm -rf DELETE

答案2

就像是

paths=("some" "paths")
for path in "${paths[@]}"
do
    [ -e "$path" ] || exit 1
done

对于初学者来说,每个rm命令之前的命令要复杂得多,并且取决于 Bash 数组。

答案3

for path in "some" "paths"
do
    [ -e "$path" ] || exit 1
done

更可移植,但意味着复制循环和命令中的路径列表rm。将所有路径存储在同一个字符串变量中意味着脚本不再支持IFS文件名中的任何字符。

相关内容