将Linux目录结构作为树打印
1. 简介
在本教程中,我们将讨论在 Linux 中递归显示目录结构内容的不同方法。我们将首先查看几个内置命令,然后我们将探索Linux tree 命令及其提供的用于将目录结构打印为树的选项。
2. 使用ls并find
首先,让我们探索一些内置命令。第一个是*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-get或yum 安装它。
如果我们使用 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并探索所有选项。