【发布时间】:2020-03-07 17:27:03
【问题描述】:
我列出了占用硬盘空间最多的前 20 个文件/文件夹。我想将它们分成size path/to/file。以下是我到目前为止所做的。
我正在使用:var=$(du -a -g /folder/ | sort -n -r | head -n 20)。它返回以下内容:
120 /path/to/file
115 /path/to/another/file
110 /file/path/
等等
我已尝试使用以下代码将其拆分为单行。
for i in $(echo $var | sed "s/\n/ /g")
do
echo "$i"
done
我想要的结果如下:
120 /path/to/file,
115 /path/to/another/file,
110 /file/path/,
等等
这是我得到的结果:
120,
/path/to/file,
115,
/path/to/another/file,
110,
/file/path/,
等等
【问题讨论】:
-
var=$(cmd... )几乎总是有麻烦。稍微好一点的是varArr=( $(cmd ...) ),其中返回的内容存储为一个数组,您可以使用${varArr[@]}(对于整个事物)或单独使用${varArr[1]}(但从0开始)访问该数组。更好的是(通常)是( cmds_that_produce_output | filters | rearrangers | etc ) | while read sz fName ; do printf "%06.2d\t%30s\n" $sz $fName ; done排序,或者甚至用awk脚本替换while循环。 (在 `printf spec 修饰符上搜索)但是,抱歉,没有时间深入研究您的具体问题。祝你好运! -
@shellter 不幸的是,这对我不起作用,我正在使用的服务器不支持
bash。只有sh,所以我不能使用数组。 -
如果您使用的是
var=$(cmd)($(...)部分),那不是“真实的” /bin/sh (来自 80 年代 ;-) )。你从echo SHELL="$SHELL" ; uname -srv得到什么?祝你好运。 -
@shellter 当我运行该命令时,我得到
SHELL=/usr/bin/ksh