快速递归删除的快捷方式

快速递归删除的快捷方式

有时我想递归地删除大片临时文件,并回收目录名而不等待命令完成。 (例如,如果我想删除并重新签出版本控制工作副本。)

虽然这种情况并不经常发生,但当它发生时我通常使用如下命令:

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

相关内容