centos 7 中 head 命令的 z 标志

centos 7 中 head 命令的 z 标志

我正在阅读@dessert 的回答:https://askubuntu.com/a/990771/853133关于如何在 Ubuntu 中使用 cron 从目录中删除旧的备份文件夹。给出的命令是:

find /BACKUPDIR/ -mindepth 1 -maxdepth 1 -type d -print0 | sort -z | head -zn-6 | xargs -0 echo rm -rf

然而,CentOs 7 不喜欢在 head 调用中使用 z 标志:

head: invalid option -- 'z'

CentOs7 有解决方法吗?

我看了一下:当我没有可用的“-z”选项时,如何执行与“head -z”等效的命令?我认为这个解释不适用于我的问题。如果我想删除早于 n 的备份,我不知道如何更改命令。

答案1

是的,在过去的几十年里,GNU 实用程序逐渐添加了对 NUL 分隔记录的支持。 GNUhead -z是相对较新的(2015 年),而 GNUsort已有-z数十年(1996 年)甚至xargs -0更长时间(1990 年)。

在这里,你还可以这样做:

find /BACKUPDIR/ -mindepth 1 -maxdepth 1 -type d -print0 |
  sort -rz | sed -z 1,6d | xargs -r0 echo rm -rf

-zGNU 的添加是sed最近的(2012 年),但不像head的那么新。

数十年来,GNU 文本实用程序一直能够处理其输入中的 NUL 字节,因此您始终可以执行以下操作:

find /BACKUPDIR/ -mindepth 1 -maxdepth 1 -type d -print0 |
  tr '\0\n' '\n\0' |
  sort -r | tail -n +7 | 
  tr '\0\n' '\n\0' |
  xargs -r0 echo rm -rf

或者您可以随时安装zsh并执行

echo rm -rf /BACKUPDIR/*(D/[1,-7])

(另请参阅它的nglob 限定符以数字方式排序,因此 10 排序在 9 之后,而不是在 1 和 2 之间排序)。

(以上日期来自变更日志,包含这些更改的官方版本可能会晚一些)。

相关内容