如何从 du -h 输出末尾删除文件名?

问题描述 投票:0回答:9

举个例子:

$ du -h file_size.txt
112K file_size.txt

如何从

du -h
的输出中删除文件名?

我尝试使用

sed
搜索字符串(文件名)并将其替换为任何内容,但它不起作用 - 下面的命令:

du -h file_size.txt | sed 's/ 'file_size.txt'//'

有人可以指出为什么这不起作用,或者也许有更好的方法吗?

linux sed awk
9个回答
22
投票

您在该命令行中有一些错误的引用。 最简单的可能是:

du -h file_size.txt | cut -f -1

修复命令行:

du -h file_size.txt | sed 's/file_size.txt//'

由于您的帖子有

awk
标签:

du -h file_size.txt | awk '{ print $1 }'

14
投票
du -h file_size.txt | cut -f1

5
投票

简单输出第一列。这是 awk 解决方案

du -h test.txt  | awk '{ print $1 }'

1
投票

为什么不只是

stat
它?

 stat -f '%z' vg1.mp4   # BSD-stat
821258414
gstat -c '%s' vg1.mp4   # GNU-stat
821258414

如果你坚持

du
的方式,获得第一列比提到的更干净:

du -smh vg1.mp4 | awk NF=1 
783M

wc
方式 - 使用
<
重定向通过管道发送文件,因此您不需要修剪文件名 —- 以某种方式将 BSD-wc 填充在额外的空间中

gwc -c < vg1.mp4    # GNU-wc      
821258414
 wc -c < vg1.mp4    # BSD-wc
 821258414

0
投票

这有点冗长,但无论如何,这是实现您想要的另一种方式:

du -h file_size.txt |while read x junk; do echo $x; done

0
投票

@OP 如果您的数据具有不同的字段,例如空格/制表符,那么使用 awk/cut 等工具通过分隔符在这些字段上分割它们会更容易。不需要使用正则表达式(例如 sed )。更好的是只使用 shell。

各种方式

$ du -h file | awk '{print $1}'
4.0K

$ du -h file | cut -f1
4.0K

$ set -- $(du -h file) #using shell only
$ echo $1
4.0K

0
投票

您原来的命令本来可以工作,除非您在 sed 正则表达式和 du 输出选项卡中包含空格。


0
投票

du -h
的输出以 [制表符] 分隔。

du -h file_size.txt |sed 's/[\t].*//g'

0
投票

处理包含换行符的文件名:

$ du -h $'./filename\nwith\nnewlines.txt' | awk 'NR==1 { print $1 }'
4.0K

有一个非常酷的

sed
解决方案,使用“打印并退出”技巧,来自这里

$ du -h $'./filename\nwith\nnewlines.txt' | sed -E -n '/(.*)\t.*/{s//\1/p;q;}'
4.0K

这里的大多数其他答案都不能处理换行符(除了 Ghostdog 的

set
答案):

$ du -h $'./filename\nwith\nnewlines.txt' | cut -f1
4.0K
with
newlines.txt
© www.soinside.com 2019 - 2024. All rights reserved.