通过Bash删除FreeBSD上除X最旧目录之外的所有目录(没有-printf,带空格,没有zsh)

ski*_*mon 5 bash freebsd

stackoverflow上有几个不同的主题,用于查找/删除目录中最旧的目录/文件.我已经阅读了很多这些,并且看到了无数不同的方式,显然对其他系统上的某些人有用,但在我的特定情况下却不适合我.

限制是:

我得到的最接近的是这样的(不完整):

find . -maxdepth 1 -d -name "Backup Set*" -print0 | xargs -0 stat -f "%m %N" | sort -r| awk 'NR>5'
Run Code Online (Sandbox Code Playgroud)

这给了我要删除的目录,但是现在它们的前面有时间戳,我不确定如果我剥离并管道到rm我将回到我无法删除带有空格的目录的情况.

输出:

1450241540 ./Backup Set1
1450241538 ./Backup Set0
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助.


我看过的相关帖子:

https://superuser.com/questions/552600/how-can-i-find-the-oldest-file-in-a-directory-tree

Bash脚本:删除最旧的目录

删除bash中除最新的X文件之外的所有文件

Mr.*_*ama 3

... | awk 'NR>5' | while read -r timestamp filename; do rm -rf "${filename}"; done
Run Code Online (Sandbox Code Playgroud)

当字段数多于 中指定的变量时read,剩余部分将简单地集中到最后指定的变量中。在我们的例子中,我们提取时间戳并按原样使用其他所有内容作为文件名。我们迭代输出并运行rm为每个条目运行一个。

我建议使用echo而不是进行测试运行rm,以便您可以先验证结果。


或者,如果您更喜欢一个xargs -0版本:

... | awk 'NR>5' | while read -r timestamp filename; do printf "%s\0" "${filename}"; done | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

这也使用while read但打印带有空字节分隔符的每个文件名,该分隔符可以由xargs -0.