从命令输出中提取带有空格的 Unix 兼容文件路径

从命令输出中提取带有空格的 Unix 兼容文件路径

命令 :

du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1

正在给我:

41G     /Users/user/Big folder

如何提取路径以在脚本中重用它?

du -sh $HOME/* | grep '[0-9]G\>' | sort -k 1rn | head -1 | awk '{ print $2 }'

会输出

/Users/user/Big

这是无法使用的,我正在寻找如下结果:

/Users/user/Big\ folder

答案1

在进行自动化处理时,不要因为使用不同单位的数字而使你的生活变得更加复杂。不要传递-hdu.然后,您可以对输出使用简单的数字排序,并且如果其中一个目录中有超过 1 TB 的数据,您的脚本仍然可以工作。

du -s ~/* | sort -k 1n | tail -n1

即使最大的子目录包含的内容小于 1 GB,这也始终会打印出一行。如果这不是您想要的,您可以将条件“输出是否为空”替换为“数字是否小于阈值”。

要提取目录名称,请获取输出并删除直到第一个选项卡的部分。

largest_directory=$(du -s ~/* | sort -k 1n | tail -n1)
largest_directory_size_kB=${largest_directory%%$(printf '\t')*}  # if you need the size
largest_directory=${largest_directory#*$(printf '\t')}

答案2

正面:

du -s "$HOME"/* | sort -rnk1 | LC_ALL=C sed -e "s,[^/]*\(/.*\),'\1',;q"

如果没有-hdu结果将包含简单的大小数字,因此我们可以轻松地对其进行排序,而无需额外的grep

使用sed在第一行执行删除然后退出,我们保存一个head调用。

答案3

提取所需路径的另一种方法是read在完成这些du操作后通过命令sort-ed,然后将其传递给while/read

du.. sort.. | while read x d; do echo "$d"; done

相关内容