问题很简单,但是我找不到快速,优雅的解决方法。
我接下来要决定:如果文件的块大小大于6,则应该打印文件名。
stat a.txt b.txt | awk '/Blocks/ {print $4} /File/ {print $2}'
此代码返回
'a.txt'
3
'b.txt'
10
但是,如果我使用NR==...
,则会使用文件名剪切行。
答案 0 :(得分:3)
您可以格式化stat
的输出以简化处理(需要GNU stat
):
stat -c '%b %n' a.txt b.txt | awk '$1 > 6 {print $2}'
其中(摘录自man page)
%b
分配的块数
%n
文件名
或者,如果文件名包含特殊字符,则可以使用引号将它们打印出来:
stat -c '%b %N'
其中
%N
用引号引起来的文件名(如果使用符号链接则取消引用)
答案 1 :(得分:0)
类似的东西:
stat a.txt b.txt | awk '/File/{filename=$2} $1~/Size/ && $4>6 {print filename, $2}`
在将文件名捕获到变量filename
的位置,然后如果发现Size
行并且第二列大于6,则打印文件名和块大小。
我有点在想你在找什么。
答案 2 :(得分:0)
解析stat
很好的输出并为此使用awk
似乎不是我的最佳解决方案。 stat
具有输出printf修饰符,您可以仅打印所需的信息。
在这里,我将find与xargs一起使用,并进行了一些外壳比较:
find a.txt b.txt -printf "%b\0%f\0" | xargs -0 -n2 -- sh -c '[ "$1" -gt 6 ] && echo "$2"' --
或者如果您需要统计信息:
stat a.txt b.txt --printf="%b\0%n\0" | xargs -0 -n2 -- sh -c '[ "$1" -gt 6 ] && echo "$2"' --
但是如果您不需要处理文件名中的所有字符,也许就足够了:
stat a.txt b.txt --printf="%b %n\n" | awk '{$1>6}1' | cut -d' ' -f2
减少切割幅度或更多:
stat a.txt b.txt --printf="%b %n\n" | awk '{if ($1>6) { print $2; }}'