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/bash
and ~/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
文件名中的任何字符。