要查找比我正在使用的最新 8 旧的文件:
find . -maxdepth 1 -type f -printf '%T@ %p\0' | sort -rz | sed -z 1,8d
该-printf '%T@ %p\0'
命令将最后修改的时间戳(表示为自 1970 年 1 月 1 日 00:00 GMT 以来的秒数,带有小数部分)到每个匹配的以零结尾的文件名的开头,例如:
1597765267.7628475560 ./fileName2.txt1597765264.0267179360 ./fileName1.txt
为了通过管道删除这些最旧的文件xargs -0 gio trash
,我需要删除时间戳。所以我添加了另一个 sed 命令来执行此操作:
find . -maxdepth 1 -type f -printf '%T@ %p\0' | sort -rz | sed -z 1,8d | sed -z "s/^[0-9]*.[0-9]* //g"
现在我有正确的输出,但是有更好更有效的方法吗?
根据@Quasímodo 的回答,我尝试使用 sed 删除模式格式进一步简化(因为我实际上并没有替换任何东西),但我没有得到任何输出:
find . -maxdepth 1 -type f -printf '%T@ %p\0' | sort -rnz | sed -z "1,8d; /^[0-9]*\.[0-9]* /d"
任何建议表示赞赏。
结论(来自多个响应):
find $targetPath -maxdepth 1 -type f -printf '%T@ %p\0' | sort -rnz | sed -z "1,${retain}d; s/^[^ ]* //"
Where :
$targetPath, 查找文件的目录,例如当前目录 '.'
${retain},要保留的最新文件数,例如 8
由于您控制输出,因此很容易删除时间戳。您知道每条
\0
-delineated 记录都以时间戳开头,然后是空格。因此,您需要做的就是删除所有非空格字符,直到第一个空格:但是,您可能需要数字排序,您也可以只对第一个字段进行排序,而无需对文件名进行排序。因此,这将为您提供 8个最旧的文件:
将两个 Sed 进程转换为一个。
应用的更正:
n
数字排序。.
匹配任何字符,它应该\.
在正则表达式中。g
替换记录中的所有匹配项。您只需要从每条记录中进行一次替换(即删除时间戳),因此请删除g
. 此修改还提高了性能。您的尝试
sed -z "1,8d; /^[0-9]*\.[0-9]* /d"
失败,因为/^[0-9]*\.[0-9]* /d
删除了与正则表达式匹配的每一行。这与s/^[0-9]*\.[0-9]* //
删除匹配正则表达式的字符串不同。您可以将
find
命令与 GNU 一起使用awk
:这里:
我们将输入记录分隔符 (
RS
) 和输出记录分隔符 (ORS
) 设置为\0
。对于从第8
NR>8
条记录开始sub(/[^ ]+ /, "")
(print
感谢@Quasimodo建议对上述命令进行改进。例子: