如何在一个命令中找出一个文件有多少位?


9

我知道我可以ls -lat用来查找一个文件有多少字节,然后乘以8可以找到多少位。但这仅在一个命令行中可行吗?


5
我不这么认为。我也看不到像这样的功能有任何实际用途^^
Martin von Wittich 2014年

1
@MartinvonWittich -互联网的速度往往是在“做比特每秒” ...
维尔夫

4
@wilf:减去协议开销。
伊格纳西奥·巴斯克斯

在我的情况下,我正在使用此套装测试:csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html,该参数是我要分析的位数。
费利佩

Answers:


15

使用GNU du

du -b FILE | awk '{ print $1, "* 8" }' | bc

9
除非不需要bc- awk可以自己做数学:du -b FILE | awk '{print $1 * 8}
aragaer 2014年

另见wc -c < FILE的便携式当量(对于非正规的文件,它具有读取它们的副作用,虽然)
斯特凡Chazelas

5

Shell + GNU coreutils解决方案:

echo $(( 8 * $(stat -c%s FILE) ))

-c%s选项stat仅返回文件大小(以字节为单位),从而无需进行其他文本处理。GNU coreutils支持此语法,因此应该在大多数linux发行版中都可以使用。

作为Linux上的一个例外,如果使用可选的zsh / stat模块运行zsh,则需要指定一条路径来获取GNU coreutils:

echo $(( 8 * $(command stat -c%s FILE) ))

@StephaneChazelas感谢您的信息。答案已更新。
2014年

似乎很好的解释,谢谢。但是在我的测试中,该命令返回给我:title:7:错误的数学表达式:操作数应在'%s'] 2; echo 4096000 ----答案是4096000,但是其他错误是什么?
费利佩

@FelipeMicaroniLalli我无法重现该错误,并且看不到任何会同时(a)给出该错误消息,同时(b)给出正确的数值答案的情况。好奇。
2014年

3

使用GNU find(比GNU早stat几十年):

find file -prune -printf '%s*8\n' | bc

相对便携:

ls -ld -- "$file" | awk '{print $5*8;exit}'

3

可以在一行中,因为您可以在一条线上放置多个命令,例如通过管道或命令替换来连接:

echo $(stat -c %s FILE) '* 8' | bc

(感谢@frostschutz进行更新)。


对我来说就像是一种魅力。➜tmp stat random-file-3 | sed -n's / Size:([0-9] *)。* / \ 1 * 8 / p'| 公元前➜4096000
费利佩

无法在非英语语言环境或非GNU系统上运行,也无法在文件(ZSize: 5例如
StéphaneChazelas)中使用

1
如何stat -c %s FILE直接打印尺寸而不是sed
弗罗斯特斯2014年

2

单个文件:

wc -c yourfile | awk '{print $1*8}'

多个文件:

wc -c yourfile1 yourfile2 | awk '{$1*=8; print $0}'

这也适用于单个文件。但是,它并不是完全防弹的,请参阅Stephane的评论。

这些是POSIX标准兼容命令。


大。太棒了 ➜tmp wc -c random-file-1 random-file-2 random-file-3 | awk'{$ 1 * = 8; 打印$ 0}'-32832 random-file-1-49152 random-file-2-4096000 random-file-3-4177984总计
Felipe

1
请注意,如果文件不是常规文件,则会产生副作用。第二个将a    b文件显示为a b(将空格序列转换为单个空格,删除尾随空格)。
斯特凡Chazelas

@StephaneChazelas请尝试使用哪种非常规文件?
Totor 2014年

任何类型(FIFO,插座,门,设备,目录...)。您也会遇到文件名也包含换行符的问题。您可能要添加NR == 1
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.