我想检查最新文件的大小是否大于 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 限定符。如果您想考虑非常规文件(目录、符号链接、设备...),请删除.
这个想法是扩展这两个范围:
.
非隐藏常规 ( ) 文件列表,o
按m
修改时间排序,仅限一个 ([1]
)。- 相同,但仅限于
L
长度严格大于 (+
)的文件2097152
(但启用N
ullGlob,因此如果没有匹配项,这不是致命错误)。
我们的条件是指两个 glob 都扩展到同一个文件。
请注意ls -s
, 不报告文件的大小,而是报告它们的磁盘使用情况(以 512 字节单位的数量或 KiB 或其他形式表示,具体取决于实施ls
和/或环境)。ls
报告其中的文件大小长的输出格式(ls -l
或ls -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)