total 36
对于我的家庭作业,我尝试在 Linux 中从此处生成的输出中获取输出ls -s
:
vboxuser@Ubuntu:~$ ls -s
insgesamt 36
4 Bilder 4 Dokumente 4 Downloads 4 Musik 4 Öffentlich 4 Schreibtisch 4 snap 4 Videos 4 Vorlagen
我尝试了一些带有awk
or 的命令du
,但它没有给我想要的输出,而我能得到的最接近的输出是
ls -s --block-size=1024
有命令可以帮助我吗?
答案1
这应该做你想要的:
ls -s | grep ^total
在文件列表中,每个文件的名称前面都有其大小,因此即使存在名为“total”的文件,也不会对其进行 grep。
请注意,您必须将 shell 语言(区域设置)从德语更改为英语才能正常工作!
答案2
使用珀尔:
~$ ls -s | perl -ne '$. == 1 && print $_;'
或者:
~$ ls -s | perl -ne 'print $_ if $. == 1;'
使用乐(以前称为 Perl_6):
~$ ls -s | raku -ne '++$ == 1 && .put;'
或者:
~$ ls -s | raku -ne '.put if ++$ == 1;'
由于ln -s
在第一输出行上打印总数,因此上面的答案基本上解决了问题,“如何打印 <STDIN> 的第一行?”
两种语言(Perl 和 Raku)都实现并依赖-ne
“非自动打印逐行”命令行标志,允许行号变量控制输出。
使用 Perl,$.
测试行号变量是否等于 1;然后&&
短路运算符print
就是$_
主题变量。或者(第二个示例),if
使用条件。
使用 Raku,匿名$
标量预先递增 ( ++$
) 并测试为等于 1;然后&&
短路运算符put
就是$_
主题变量。该代码.put
是 的缩写$_.put
,相当于put $_
.或者(第二个示例),if
使用条件。
示例输出(所有四个代码示例):
total 36
答案3
当使用、、、、选项ls
之一调用来列出目录的内容时,就像在没有文件名参数的情况下调用时一样,在这种情况下,它默认列出(当前工作目录),它会在其输出中添加前缀:-s
-l
-n
-o
-g
.
total <a-number>
该数字是所列出的文件占用的分配的 512 字节磁盘空间单位数的总和。对于 的 GNU 实现find
,它以 1024 字节为单位,除非使用其环境中的变量进行调用,或者使用选项或环境变量POSIXLY_CORRECT
指定块大小。--block-size
BLOCK_SIZE
LS_BLOCK_SIZE
使用 busybox 或 toybox (Android) ls
,即使POSIXLY_CORRECT
在环境中,您也会获得 1024 字节单位,并且似乎没有任何方法可以修复这种不合规情况。
大多数其他实现应报告 512 字节单元的数量。
通过ls
本地化的实现,total
可以将其翻译成用户的语言,这似乎就是您的情况。为了total
不管用户的区域设置如何,您都可以LC_ALL=C
在其环境中调用它,C 又名 POSIX 区域设置是您保证拥有的唯一区域设置,total
因为这就是标准指定的方式。
所以:
POSIXLY_CORRECT=1 LC_ALL=C ls -s | head -n 1
获取除 busybox/toybox 之外的 512 字节单元总数。
对于 1024 字节单元的数量,对于 GNUls
特别是:
LC_ALL=C ls --block-size=1024 -s | head -n 1