bash - 一旦目录中有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/ 。有什么办法可以做到这一点?
解决方案
如果你想使用bash,这很容易用两个命令完成:
$ 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 最年轻的)
当您想在zsh中执行此操作时,可以执行以下操作:
$ files=( *(.om) )
$ (( ${#files[9,-1]} != 0 )) && rm "${files[9,-1]}"
这将创建一个数组 files,其中包含按修改时间(.)
排序的文件。(om)
然后我们选择从位置 9 开始直到结束的文件。为了安全起见,我们首先检查该子列表中是否有文件。
这里介绍的两种方法都避免了您可能遇到的有趣文件名的任何问题。
推荐阅读
- javascript - PHP脚本中的echo内的JavaScript函数没有调用
- c# - 如何修复错误:无法将 int 隐式转换为字符串
- javascript - 在 React 子父组件中将 Props 向上传递到多级
- ruby-on-rails - 从 Ruby 中的字符串动态设置对象属性的更优雅的方法
- c++ - C++ 我应该使用什么来保存格式化为 sprintf() 之类的字符串变量?
- wpf - WPF:工具栏是键盘陷阱
- linux - vps重启时自动启动脚本?
- vba - Excel VBA 使用最后一张工作表中的数据创建一个新工作表
- pandas - Pandas cumsum 来自每组的第二个元素
- watson-conversation - 如何在 IBM Watson Assistance 用户界面的情况下获得意图价值?