linux - bash 根据年龄删除子目录但保留最后一个 X

标签 linux bash

我发现了几个与此类似的问题以及每个问题的详细答案,但似乎没有一个适合我。

这是我的。我在这里只查看目录,忽略文件。

dir1/1/
dir1/2/
dir1/3/
dir2/1/
dir2/2/
dir2/3/

这里有很多目录(~800),其中很多有很多子目录(有的超过2000)。

注意:子目录永远不会包含空格或任何特殊字符,它们只是数字,所以我可以解析 ls 的输出。

我需要做的是删除所有已存在 X 天的子目录,但我始终必须保留最后 N 个目录。在这种情况下,删除 90 天前的所有内容,但始终保留最后 10 个目录。

我可以做其中之一,但似乎不能两者兼得。此命令获取所有超过 90 天的子目录:

find * -mindepth 1 -maxdepth 1 -type d -mtime +90

这个命令让我得到每个目录中除了最后十个子目录之外的所有子目录:

在 $(ls) 中的 d;执行 ls -t $d |尾-n+11;完成

然而,我需要的是两者的结合:删除所有超过 90 天的目录,但保留最后 10 天。

注意:我知道上面的命令实际上都没有执行任何删除操作,我只是想在将 rm 添加到 xargs 之前让它输出正确的结果,或者-exec.

有什么建议吗?

感谢@totoro 和@daniel Azuelos 的回答,这对我有用:

 for d in *; do
   if [ -d "$d" ]; then
      marker=$(ls -td "$d/*/" | sed -n '10p')
      find "$d" -mindepth 1 -maxdepth 1 -type d -mtime +90 ! -newer "$d"/"$marker"
   fi
 done

最佳答案

ls -t | sed -n '10p'

将为您提供第 10 个最近的文件或目录的名称。 这将是您的时间标记

找到 ... -mtime +90 ! -更新time_marker...

将完成剩下的工作。

关于linux - bash 根据年龄删除子目录但保留最后一个 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988190/

相关文章:

c - 如何在 Linux 中使用 ioctl(原始分区)正确刷新磁盘缓存

c++ - 在 Ubuntu 中调用共享库

linux - 用存储在sed变量中的文件内容替换两行之间的文本

linux - 使用 datadog 导入指标时出现问题

c - 如果没有预先 ping 则 UDP 数据包不会到达

linux - 如何循环直到 IP :port is not responding

linux - 如何使用 Bash 解析 HTTP header ?

python - 用于检查哪个串行端口已连接的 Bash 脚本

bash - md5 目录树中的所有文件

c++ - 在信号处理程序中使用互斥体