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

时间:2015-12-17 22:53:29

标签: bash freebsd

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

约束是:

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

find . -maxdepth 1 -d -name "Backup Set*" -print0 | xargs -0 stat -f "%m %N" | sort -r| awk 'NR>5'

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

输出:

1450241540 ./Backup Set1
1450241538 ./Backup Set0

感谢您的帮助。

我看过的相关帖子:

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

Bash scripting: Deleting the oldest directory

Delete all but the most recent X files in bash

2 个答案:

答案 0 :(得分:3)

... | awk 'NR>5' | while read -r timestamp filename; do rm -rf "${filename}"; done

如果字段多于read中指定的变量,则余数只是在最后指定的变量中汇总在一起。在我们的例子中,我们提取时间戳并使用其他所有内容作为文件名。我们迭代输出并为每个条目运行rm

我建议您使用echo代替rm进行测试,以便先验证结果。

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

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

这也使用while read但是打印每个文件名都有一个空字节分隔符,可以被xargs -0摄取。

答案 1 :(得分:0)

管道此剪切命令cut -d ' ' -f 2-将取出时间戳

简单的例子

echo '1450241538 ./Backup Set0'|cut -d ' ' -f 2-

将摆脱时间戳

结果将是

./Backup Set0