我发现了几个与此类似的问题以及每个问题的详细答案,但似乎没有一个适合我。
这是我的。我在这里只查看目录,忽略文件。
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/