您不需要grep输入颜色代码,-d
选项为list directories only
。
这似乎可以满足您的要求:
$ tree --du -d -shaC | grep -Ev '( *[^ ]* ){2}\['
.
├── [ 18] dir1
├── [ 30] dir2
├── [ 205] junk
│ ├── [ 18] dir1
│ ├── [ 30] dir2
│ └── [ 76] dir3
├── [ 119] merge
└── [ 20] stuff
4.4K used in 10 directories
该grep
命令将两次删除所有行(一个或多个空格,后跟一个非空格,后跟一个空格),然后删除一个[
。
如果您希望深度为1,请将{}花括号内的装订数更改为{1}
而不是{2}
。如果希望深度为3,则将其更改为{3}
。
您可以将其转换为shell函数,如下所示:
mytreedu() {
local depth=''
while getopts "L:" opt ; do
case "$opt" in
L) depth="$OPTARG" ;;
esac
done
shift "$((OPTIND-1))"
if [ -z "$depth" ] ; then
tree --du -d -shaC "$@"
else
local PATTERN='( *[^ ]* ){'"$depth"'}\['
tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
fi
}
这用于从命令行getopts
“窃取”任何-L
选项及其参数tree
(如果有)。如果-L n
命令行上没有选项,则也可以。
所有其他选项和参数均传递给tree
命令。
这local PATTERN=...
条线不是必须的。我只是这样做,以确保它只适合一行,而不会在此处自动换行U&L
。正则表达式可以并且可能应该直接tree | grep ...
在线。
像这样运行它:
mytreedu
要么
mytreedu -L 2 /path/to/dir/