有时我想递归地删除大片临时文件,并回收目录名而不等待命令完成。 (例如,如果我想删除并重新签出版本控制工作副本。)
虽然这种情况并不经常发生,但当它发生时我通常使用如下命令:
mv "$oldname" dienow && rm -rf dienow &
当然,我可以为此创建一个函数或别名,但如果不这样做,是否有更短的方法来表达上述内容?
答案1
我会坚持使用两个单独的命令:
mv "$oldname" dienow
rm -rf dienow
这样,如果您不小心回忆起了历史记录中的一行,就不会因为运行单个命令而冒造成重大损害的风险。即使是新版本,该mv
命令也不会删除,并且该命令只会删除您已经声明为要删除的内容。"$oldname"
rm
如果您感到幸运并坚持使用单个命令,请将其设为函数:
mv_then_rm () {
mv -- "$1" "$1.TO_BE_DELETED" && rm -rf -- "$1.TO_BE_DELETED" &
}
这是一个多参数版本,可确保“要删除”的目录尚不存在。
mv_then_rm () {
local d tmpdir tmpdirs
tmpdirs=()
for d; do
tmpdir=$(mktemp -- "$(dirname -- "$d")/.deleting.XXXXXXXXXX")
tmpdirs+=$tmpdir
mv -- "$d" "$tmpdir"
done
rm -rf -- "$tmpdirs" &
}
答案2
您正在错过“$oldname”的娱乐。
mv "$oldname" dienow && mkdir "$oldname" && \rm -rf dienow &
我更喜欢使用 \rm 以防有人将 rm 别名为 rm -i
明确您的路径并将其作为函数添加到配置文件中
clean_old_now(){
\mv "$oldname" dienow && mkdir "$oldname" && \rm -rf dienow &
}
如果您担心不小心执行此操作,请添加提示
clean_old_now(){
read -p "Are you sure?: " sure
if [[ $? = 0 ]] && [[ "$sure" = "y" ]]; then
\mv "$workdir/$oldname" $workdir/dienow && mkdir "$workdir/$oldname" && \rm -rf $workdir/dienow &
fi
}
添加显式路径时,请确保 mv 位于同一文件系统中,以防止数据被复制
答案3
A非常务实的方法是将目录移动到 /tmp 并让机器重新启动来完成剩下的工作。或者建立一个定期清理的 cronjob(每小时一次)。
mv "$oldname" /tmp/forgetme
作为 cronjob
0 * * * * rm -rf /tmp/forgetme