有没有一个Linux命令可以从Bash脚本中调用,以树形结构的形式打印目录结构,例如:
folder1
a.txt
b.txt
folder2
folder3
有没有一个Linux命令可以从Bash脚本中调用,以树形结构的形式打印目录结构,例如:
folder1
a.txt
b.txt
folder2
folder3
这是你在寻找的吗 tree?它应该在大多数发行版中(可能作为可选安装)。
~> tree -d /proc/self/
/proc/self/
|-- attr
|-- cwd -> /proc
|-- fd
| `-- 3 -> /proc/15589/fd
|-- fdinfo
|-- net
| |-- dev_snmp6
| |-- netfilter
| |-- rpc
| | |-- auth.rpcsec.context
| | |-- auth.rpcsec.init
| | |-- auth.unix.gid
| | |-- auth.unix.ip
| | |-- nfs4.idtoname
| | |-- nfs4.nametoid
| | |-- nfsd.export
| | `-- nfsd.fh
| `-- stat
|-- root -> /
`-- task
`-- 15589
|-- attr
|-- cwd -> /proc
|-- fd
| `-- 3 -> /proc/15589/task/15589/fd
|-- fdinfo
`-- root -> /
27 directories
这是从维护者的网页中获取的例子。
你可以添加选项-L #
,其中#
被替换为数字,以指定最大递归深度。
删除-d
以显示文件。
brew install tree
。 - funfuntimeapt-cyg install tree
(假设您已经安装了apt-cyg)。 - blockloopapt-get install tree
可以安装它。 - Romeo Sierra您可以使用这个:
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
它将在几秒钟内显示当前子目录中没有文件的图形表示,例如在/var/cache/中:
.
|-apache2
|---mod_cache_disk
|-apparmor
|-apt
|---archives
|-----partial
|-apt-xapian-index
|---index.1
|-dbconfig-common
|---backups
|-debconf
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g' -e 's/^/ /'
请注意,本翻译只涉及对原文内容的转换,不包括任何解释或其他附加信息。 - Benfind . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
。 - JavaSheriff这个命令可以显示文件夹和文件。
find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
示例输出:
.
|-trace.pcap
|-parent
| |-chdir1
| | |-file1.txt
| |-chdir2
| | |-file2.txt
| | |-file3.sh
|-tmp
| |-json-c-0.11-4.el7_0.x86_64.rpm
来源:@javasheriff在这里的评论中提到。它作为评论被隐藏了,将其发布为答案可以帮助用户更容易地找到它。
find。 | grep -vE'pyc | swp | __init' | sed -e“s / [^-] [^ \ /] * \ // | / g”-e“s / | \([^ ])/ | - \ 1 /”
能够很好地工作。 - patroqueeetfind * | sed ...
命令来排序顶级目录,但这是我目前愿意思考的范围之内了。 - FlipMcF既然这是一条成功的评论,我将其添加为答案:
以树形结构打印目录结构,
包括文件
find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
sort
结合使用,方法如下: find . | sort | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
- zappee由于我对其他(非tree
)答案的输出不是太满意(请参见我的评论:Hassou's answer),因此我试图更加模仿tree
的输出。
它类似于Robert的答案,但是水平线不都从开头开始,而是从应该开始的地方开始。不过我必须使用perl
,但在我没有tree
的系统上,perl
是可用的。
ls -aR | grep ":$" | perl -pe 's/:$//;s/[^-][^\/]*\// /g;s/^ (\S)/└── \1/;s/(^ | (?= ))/│ /g;s/ (\S)/└── \1/'
输出(简化版):
.
└── fd
└── net
│ └── dev_snmp6
│ └── nfsfs
│ └── rpc
│ │ └── auth.unix.ip
│ └── stat
│ └── vlan
└── ns
└── task
│ └── 1310
│ │ └── net
│ │ │ └── dev_snmp6
│ │ │ └── rpc
│ │ │ │ └── auth.unix.gid
│ │ │ │ └── auth.unix.ip
│ │ │ └── stat
│ │ │ └── vlan
│ │ └── ns
ls
隐藏文件,如下所示:ls -aR | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// /g'
输出(更加简洁):
.
fd
net
dev_snmp6
nfsfs
rpc
auth.unix.ip
stat
vlan
ns
ls -R
命令输出中不想要的垂直线的唯一方法是从最后一行开始进行处理。请参考我提供的基于 awk 的解决方案,您可以轻松地将其适应到 perl 中。 - François Tonneau要将Hassou的解决方案添加到您的.bashrc中,请尝试:
alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"
alias lst='ls -R | grep ":$" | sed -e '"'"'s/:$//'"'"' -e '"'"'s/[^-][^\/]*\//--/g'"'"' -e '"'"'s/^/ /'"'"' -e '"'"'s/-/|/'"'"''
- Hero Qu最佳答案当然是tree
。但是,为了改进那些依赖于对ls -R
输出进行grep的其他答案,这里提供了一个使用awk打印子目录树的shell脚本。首先,一个输出示例:
. └── matching ├── bib ├── data │ └── source │ └── html ├── data │ └── plots ├── method │ ├── info │ └── soft │ ├── imgs │ │ ├── ascii │ │ └── symbol │ └── js └── ms
然后,代码:
ls -qLR 2>/dev/null \
| grep '^./' \
| sed -e 's,:$,,' \
| awk '
function tip(new) { stem = substr(stem, 1, length(stem) - 4) new }
{
path[NR] = $0
}
END {
elbow = "└── "; pipe = "│ "; tee = "├── "; blank = " "
none = ""
#
# Model each stem on the previous one, going bottom up.
for (row = NR; row > 0; row--) {
#
# gsub: count (and clean) all slash-ending components; hence,
# reduce path to its last component.
growth = gsub(/[^/]+\//, "", path[row]) - slashes
if (growth == 0) {
tip(tee)
}
else if (growth > 0) {
if (stem) tip(pipe) # if...: stem is empty at first!
for (d = 1; d < growth; d++) stem = stem blank
stem = stem elbow
}
else {
tip(none)
below = substr(stem, length(stem) - 4, 4)
if (below == blank) tip(elbow); else tip(tee)
}
path[row] = stem path[row]
slashes += growth
}
root = "."; print root
for (row = 1; row <= NR; row++) print path[row]
}
'
这段代码比其他解决方案的结果看起来更美观,因为在子目录树中,任何分支的装饰都取决于它下面的分支。因此,我们需要倒序处理ls -R
的输出,从最后一行到第一行。
awk: nonterminated character class [^
。 - Andrei我正在对@Hassou的答案输出进行美化,使用如下代码:
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//──/g' -e 's/─/├/' -e '$s/├/└/'
tree
的输出结果:.
├─pkcs11
├─pki
├───ca-trust
├─────extracted
├───────java
├───────openssl
├───────pem
├─────source
├───────anchors
├─profile.d
└─ssh
alias ltree=$'ls -R | grep ":$" | sed -e \'s/:$//\' -e \'s/[^-][^\/]*\//──/g\' -e \'s/─/├/\' -e \'$s/├/└/\''
顺便提一下,像MinGW这样的环境中无法使用tree
命令。因此替代方案是有帮助的。
tree
命令应该可以在命令提示符 (cmd
) 或 PowerShell 中使用 :-) - msafunction tree() {
find ${1:-.} | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"
}
你也可以使用find和awk命令的组合来打印目录树。详情请参考 "如何使用Linux的find和awk组合命令打印多级目录树结构"
find . -type d | awk -F'/' '{
depth=3;
offset=2;
str="| ";
path="";
if(NF >= 2 && NF < depth + offset) {
while(offset < NF) {
path = path "| ";
offset ++;
}
print path "|-- "$NF;
}}'
find
命令。或者使用find . -not -path '*/\.*'
来隐藏以.
开头的文件和文件夹。如果您希望输出结果中包含空格(如问题所示),请结合这个“find prettifier”脚本使用:find . -not -path '*/\.*' | python -c "import sys as s;s.a=[];[setattr(s,'a',list(filter(lambda p: c.startswith(p+'/'),s.a)))or (s.stdout.write(' '*len(s.a)+c[len(s.a[-1])+1 if s.a else 0:])or True) and s.a.append(c[:-1]) for c in s.stdin]"
。 - user