Contents

将Linux目录结构作为树打印

1. 简介

在本教程中,我们将讨论在 Linux 中递归显示目录结构内容的不同方法。我们将首先查看几个内置命令,然后我们将探索Linux tree 命令及其提供的用于将目录结构打印为树的选项

2. 使用lsfind

首先,让我们探索一些内置命令。第一个是*ls -l -R*(递归),我们来看看:

$ ls -lR
.:
total 4
drwxr-xr-x 10 ubuntu ubuntu 4096 Apr 29 18:21 ubuntu
./ubuntu:
total 12
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 29 10:30 mydirectory1
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 29 10:43 mymovies
drwxrwxr-x 4 ubuntu ubuntu 4096 Apr 29 16:28 mytrips
./ubuntu/mydirectory1:
total 4
-rw-rw-r-- 1 ubuntu ubuntu    0 Apr 29 10:30 file1
-rw-rw-r-- 1 ubuntu ubuntu    0 Apr 29 10:30 file2
-rw-rw-r-- 1 ubuntu ubuntu    0 Apr 29 10:30 file3
...

第二个选项是使用find

$ find
.
./ubuntu
./ubuntu/.bash_history
./ubuntu/.lesshst
./ubuntu/.config
./ubuntu/.config/mc
./ubuntu/.config/mc/panels.ini
./ubuntu/.config/mc/ini
./ubuntu/.bash_logout
...

这些命令的输出不太直观,但根据我们的要求,它们会为我们提供相同的信息。

3. 安装tree命令

tree命令是一个Linux 程序,它以类似于树结构的更有用的方式列出我们的目录和文件。

由于默认情况下未安装tree,因此我们需要使用apt-getyum 安装它。

如果我们使用 Debian 或 Ubuntu,我们可以使用apt安装tree

$ sudo apt install tree

如果我们使用 Red Hat、CentOS 或 Fedora,我们可以使用yum

$ sudo yum install tree

4. 使用tree命令

4.1. 默认行为

一旦我们安装了tree命令,我们就可以以的格式列出我们的目录和文件。

不带参数执行,它将打印我们当前目录的结构,包括所有未隐藏的子目录和文件

$ tree
.
└── ubuntu
    ├── mydirectory1
    │   ├── file1
    │   ├── file2
    │   ├── file3
    │   ├── file4
    │   └── letters
    │       ├── books
    │       ├── magazines
    │       └── readme
    ├── mymovies
    │   ├── comedy
    │   ├── drama
    │   ├── terror
    │   └── thriller
    └── mytrips
        ├── mydirexample
        │   └── file.txt
        └── pictures
            ├── Australia
            ├── France
            ├── Germany
            ├── Japan
            └── USA
7 directories, 17 files

我们可以清楚地看到所有目录、子目录和文件的树形结构,通过线连接以提高可视化。

让我们看一下可以与tree命令一起使用的最常见的标志。

4.2. 包括隐藏文件和目录

要在输出中包含隐藏目录和文件,我们将使用*-a* (all) 标志

$ tree -a
.
└── ubuntu
    ├── .bash_history
    ├── .bash_logout
    ├── .bashrc
    ├── .cache
    │   ├── mc
    │   │   └── Tree
    │   └── motd.legal-displayed
    ├── .config
    │   └── mc
    │       ├── ini
    │       └── panels.ini
    ├── .gnupg
    │   └── private-keys-v1.d
    ├── .lesshst
    ├── .local
    │   └── share
    │       └── mc
    │           └── history
    ├── .profile
    ├── .ssh
    │   ├── DETELEME
    │   └── authorized_keys
    ├── .sudo_as_admin_successful
    ├── .viminfo
    ├── mydirectory1
    │   ├── file1
    │   ├── file2
    │   └── letters
...

4.3. 仅打印目录

如果我们只想显示目录,我们可以使用**-d (目录)标志**:

$ tree -d
.
├── mydirectory1
│   └── letters
├── mymovies
└── mytrips
    ├── mydirexample
    └── pictures

4.4. 包括路径

我们还可以使用*-df*(目录和完整路径)标志仅显示目录。我们将看到它与*-d 相同,*但输出将向我们显示从当前目录到它找到的每个目录的相对路径:

$ tree -df
.
└── ./ubuntu
    ├── ./ubuntu/mydirectory1
    │   └── ./ubuntu/mydirectory1/letters
    ├── ./ubuntu/mymovies
    └── ./ubuntu/mytrips
        ├── ./ubuntu/mytrips/mydirexample
        └── ./ubuntu/mytrips/pictures

如果我们提供起始目录的完整路径,-df选项将显示每个目录的完整路径:

$ tree -df /home/ubuntu/mytrips
/home/ubuntu/mytrips
├── /home/ubuntu/mytrips/mydirexample
└── /home/ubuntu/mytrips/pictures

如果我们还想查看文件,我们只能使用-f (完整路径)标志:**

$ tree -f
.
├── ./mydirectory1
│   ├── ./mydirectory1/file1
│   ├── ./mydirectory1/file2
│   ├── ./mydirectory1/file3
│   ├── ./mydirectory1/file4
│   └── ./mydirectory1/letters
│       ├── ./mydirectory1/letters/books
│       ├── ./mydirectory1/letters/magazines
│       └── ./mydirectory1/letters/readme
├── ./mymovies
│   ├── ./mymovies/comedy
│   ├── ./mymovies/drama
...

4.5. 限制要打印的层数

想象一下,我们有一个由数百个目录和子目录组成的结构,但我们只想显示到我们的子目录的第二级。我们可以使用-L(级别)标志**定义显示的级别数,然后是要可视化的级别数:

$ tree -L 2
.
└── ubuntu
    ├── mydirectory1
    ├── mymovies
    └── mytrips

4.6. 打印权限和尺寸

现在我们有兴趣查看有关文件权限和使用空间的信息。我们可以分别使用*-p* (permissions) 和*-h* (human) flags来做到这一点:

$ tree -ph
.
└── [drwxr-xr-x 20.0K]  ubuntu
    ├── [drwxrwxr-x 50.0K]  mydirectory1
    │   ├── [-rw-rw-r--    25.0K]  file1.txt
    │   ├── [-rw-rw-r--    75.0K]  file2.txt
    │   ├── [-rw-rw-r--    10.0K]  file3.txt
    │   ├── [-rw-rw-r--    0]  file4.txt
    │   └── [drwxrwxr-x 4.0K]  letters
    │       ├── [-rw-rw-r--   13]  books
    │       ├── [-rw-rw-r--    0]  magazines
    │       └── [-rw-rw-r--    0]  readme
    ├── [drwxrwxr-x 13.0K]  mymovies
    │   ├── [-rw-rw-r--    0]  comedy
    │   ├── [-rw-rw-r--    6.0K]  drama
    │   ├── [-rw-rw-r--    100M]  terror
    │   └── [-rw-rw-r--    0]  thriller
    └── [drwxrwxr-x 22.0K]  mytrips
        ├── [drwxrwxr-x 4.0K]  mydirexample
        │   └── [-rw-rw-r--    20M]  file.txt
        └── [drwxrwxr-x 16.0K]  pictures
            ├── [-rw-rw-r--    0]  Australia
            ├── [-rw-rw-r--    1.0M]  France
            ├── [-rw-rw-r--    5.0K]  Germany
            ├── [-rw-rw-r--    0]  Japan
            └── [-rw-rw-r--    11.0M]  USA

如我们所见,它显示与ls -lah相同的数据,但采用树格式。

4.7. 以 JSON 格式打印树

本课的最后一个选项是使用*-J*标志以 JSON(JavaScript 对象表示法)格式打印我们的目录和文件。这种格式对于数据交换或我们需要处理命令输出是首选:

$ tree -J
[{"type":"directory","name": ".","contents":[
    {"type":"directory","name":"ubuntu","contents":[
      {"type":"directory","name":"mydirectory1","contents":[
        {"type":"file","name":"file1"},
        {"type":"file","name":"file2"},
        {"type":"file","name":"file3"},
        {"type":"file","name":"file4"},
        {"type":"directory","name":"letters","contents":[
          {"type":"file","name":"books"},
          {"type":"file","name":"magazines"},
          {"type":"file","name":"readme"}
        ]}
      ]}
    ]}
...
}]

如果我们想查看tree命令的所有可能性,我们可以在终端中输入man tree并探索所有选项。