测试最新文件的大小

测试最新文件的大小

我想检查最新文件的大小是否大于 2 MB:

test $(ls -st | head -n2 | tail -n1 | awk '{print $1}') -gt 2097152 && echo "true"

有没有更有效或更优雅的方法来做到这一点?

我尝试进一步将 awk 的输出通过管道传输到

| test {} -gt 2097152

但得到

bash: 测试: {}: 需要整数表达式

然后

| test {}>"2097152"

产量总是“true”,所以我想出了这个结构

test $(...) -gt 2097152

答案1

可能有比ls获取最新文件更好的方法,但是您所做的大部分操作都可以在 awk 中完成:

ls -st | awk 'NR == 2 && $1 > 2097152 {print "true"}'
  • NR == 2- 在第二行
  • $1 > 2097152- 当第一列大于2097152时

答案2

zsh

set -- *(.om[1]) *(N.L+2097152om[1])
if [[ $1 = $2 ]]; then
  printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
                "directory ($1) is strictly greater than 2MiB."
fi

如果要包含隐藏目录,请添加D到两个 glob 限定符。如果您想考虑非常规文件(目录、符号链接、设备...),请删除.

这个想法是扩展这两个范围:

  1. .非隐藏常规 ( ) 文件列表,om修改时间排序,仅限一个 ( [1])。
  2. 相同,但仅限于L长度严格大于 ( +)的文件2097152(但启用NullGlob,因此如果没有匹配项,这不是致命错误)。

我们的条件是指两个 glob 都扩展到同一个文件。

请注意ls -s, 不报告文件的大小,而是报告它们的磁盘使用情况(以 512 字节单位的数量或 KiB 或其他形式表示,具体取决于实施ls和/或环境)。ls报告其中的文件大小长的输出格式(ls -lls -n(或-o/-g与某些实现))。

另一种选择是使用 的zsh内置stat函数来获取最新文件的大小(或磁盘使用情况):

zmodload zsh/stat
if
  stat -LH s -- *(.om[1]) &&
    ((s[size] > 2097152))
then
  printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
                "directory ($1) is strictly greater than 2MiB."
fi

或者:

zmodload zsh/stat
if
  stat -LH s -- *(.om[1]) &&
    ((s[blocks] > 2097152))
then
  printf '%s\n' "The newest non-hidden regular file in the current directory" \
                "($1) uses more than 2097152 512-byte units of disk space."
fi

(换句话说,它的磁盘使用量超过1GiB)

相关内容