user1800997 Asked: 2017-01-01 01:49:38 +0800 CST2017-01-01 01:49:38 +0800 CST 2017-01-01 01:49:38 +0800 CST du 命令 - 在输出中显示文件或文件夹? 772 如果我运行该命令du -ah | sort -nr,是否可以让它显示输出中的哪一行是文件以及哪个文件夹?类似命令的东西显示了前面有和前面ls -l的文件和文件夹。d- du 2 个回答 Voted Best Answer Sergiy Kolodyazhnyy 2017-01-01T01:59:34+08:002017-01-01T01:59:34+08:00 这是可能的,但并非没有另一个命令的帮助。具体来说,这里我们使用的是 GNU awk(这很重要,所以请检查您的 awk 版本) $ du -ah | sort -nr | awk '{usage=$1; $1="";cmd="file "$0;cmd |& getline type;print usage,type ;close(cmd)}' 24K .: directory 4.0K ./testdir: directory 4.0K ./out.txt: ASCII text 4.0K ./3.txt: ASCII text 4.0K ./2.txt: ASCII text 4.0K ./1.txt: ASCII text 当然,这种方法有一点缺陷,因为它似乎在包含空格的文件名上失败(仍在努力改进它) 作为替代方案,我们也可以使用find命令来查找所有文件并运行file命令du来通过-exec标志进行竞标,但这看起来有点难看(请参阅编辑历史记录)。但是,我们可以使用find's -printf标志以%y格式打印文件类型以获得更漂亮的输出。 $ find -mindepth 1 -printf "%y\t" -exec du "{}" \; | sort -rn f 4 ./out.txt f 4 ./3.txt f 4 ./2.txt f 4 ./1.txt f 0 ./with space.txt d 4 ./testdir 显然这里f是用于常规文件并且d用于目录。find有关标志和文件类型字母的更多信息,请参见手册 muru 2017-01-01T02:37:25+08:002017-01-01T02:37:25+08:00 正如 Serg 所说,du自己无法做到这一点。要安全地处理文件名,最好的方法是用 ASCII nul 字符 ( \0) 分隔它们,并且du可以做到这一点。因此,使用它sort以及xargs' 处理以空分隔的输入的能力: du -0ah | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _ ,和选项告诉-0,和使用 ASCII nul 作为分隔符。-z-0dusortxargs 然后,s=${i%[[:space:]]*}获取行首直到空格(即大小),并f=${i#*[[:space:]]}获取其他所有内容(文件名)。然后我们可以ls打印带有装饰的文件名。 例子: $ du -0ah Screenshots | sort -zh | xargs -0 sh -c 'for i; do s=${i%%[[:space:]]*};f=${i#*[[:space:]]}; echo "$s" "$(ls --color -dF "$f")"; done' _ 512 Screenshots/desktop.ini* 264K Screenshots/Screenshot (1).png* 269K Screenshots/ 因为我使用ls --color了 ,所以我也得到了不错的颜色输出:
这是可能的,但并非没有另一个命令的帮助。具体来说,这里我们使用的是 GNU awk(这很重要,所以请检查您的 awk 版本)
当然,这种方法有一点缺陷,因为它似乎在包含空格的文件名上失败(仍在努力改进它)
作为替代方案,我们也可以使用
find
命令来查找所有文件并运行file
命令du
来通过-exec
标志进行竞标,但这看起来有点难看(请参阅编辑历史记录)。但是,我们可以使用find
's-printf
标志以%y
格式打印文件类型以获得更漂亮的输出。显然这里
f
是用于常规文件并且d
用于目录。find
有关标志和文件类型字母的更多信息,请参见手册正如 Serg 所说,
du
自己无法做到这一点。要安全地处理文件名,最好的方法是用 ASCII nul 字符 (\0
) 分隔它们,并且du
可以做到这一点。因此,使用它sort
以及xargs
' 处理以空分隔的输入的能力:,和选项告诉
-0
,和使用 ASCII nul 作为分隔符。-z
-0
du
sort
xargs
然后,
s=${i%[[:space:]]*}
获取行首直到空格(即大小),并f=${i#*[[:space:]]}
获取其他所有内容(文件名)。然后我们可以ls
打印带有装饰的文件名。例子:
因为我使用
ls --color
了 ,所以我也得到了不错的颜色输出: