首页 > 解决方案 > 一旦目录中有8个文件,我试图删除目录中最旧的文件

问题描述

一旦目录中有8个文件,我试图删除目录中最旧的文件。

ls -Ct /tmp/test/ | awk '{$1=$2=$3=$4=""; print $0}' | xargs rm

我希望它删除以下输出:

ls -Ct /tmp/test/ | awk '{$1=$2=$3=$4=""; print $0}' 

但我不断收到错误消息,显示这些文件不存在。我知道这是因为 xargs 正在查看我当前所在的目录,但我需要它来查看 /tmp/test/ 。有什么办法可以做到这一点?

标签: bashawklsxargs

解决方案


如果你想使用,这很容易用两个命令完成:

$ t=$(find . -maxdepth 1 -type f -printf "%T@\n" | sort -rg | awk '(NR==9)')
$ [[ "$t" != "" ]] && find . -maxdepth 1 -type f ! -newermt "@${t}" -delete

第一个命令找到第 9 个最年轻的文件并选择其在 epoch 中的修改时间。第二个命令选择不超过此修改时间的所有文件。(所以这就是为什么我们选择第 9 次,以保留 8 最年轻的)

当您想在中执行此操作时,可以执行以下操作:

$ files=( *(.om) )
$ (( ${#files[9,-1]} != 0 )) && rm "${files[9,-1]}"

这将创建一个数组 files,其中包含按修改时间(.)排序的文件。(om)然后我们选择从位置 9 开始直到结束的文件。为了安全起见,我们首先检查该子列表中是否有文件。

这里介绍的两种方法都避免了您可能遇到的有趣文件名的任何问题。


推荐阅读