Skip to content

Commit bd15666

Browse files
committed
Add find, du, ncdu
1 parent 097c4fa commit bd15666

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

docs/Ch05/index.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,95 @@ graph LR
455455
- `/var/run`:存储程序运行时的数据(部分发行版会将该目录符号链接到 `/run` 目录)。
456456
- `/var/spool`:存储「等待进一步处理」的程序数据。
457457

458+
## 列出文件系统项目 {#list-objects}
459+
460+
经常我们需要在 Shell 中列出某个目录下的项目(子目录和文件)。`ls` 命令是最常见的用来列出文件系统项目的命令,`ls -la` 则可以显示隐藏文件(`-a`)和更详细的信息(`-l`)。但是,`ls` 只能显示某个目录下的文件和子目录,并不会深入子目录内部继续检查。下面介绍几个命令,常用于获取这些信息。
461+
462+
### `find` 命令 {#cmd-find}
463+
464+
`find` 命令可以列出某个目录下所有的目录和文件,并**递归地**进入子目录。基本用法是
465+
466+
```shell
467+
$ find /etc
468+
/etc
469+
/etc/analog.cfg
470+
/etc/hosts.deny
471+
/etc/initramfs-tools
472+
/etc/initramfs-tools/initramfs.conf
473+
/etc/initramfs-tools/hooks
474+
/etc/initramfs-tools/conf.d
475+
/etc/initramfs-tools/conf.d/resume
476+
/etc/initramfs-tools/modules
477+
/etc/initramfs-tools/update-initramfs.conf
478+
... (省略)
479+
```
480+
481+
可以看到,`find` 命令将列出指定的目录下的文件和子目录名称,在遇到子目录时立即进入目录并递归地执行上面的操作。
482+
483+
该命令的一个很有用的用法是对每一个文件都执行某个命令(例如 `md5sum`):
484+
485+
```shell
486+
find . -type f -exec md5sum {} \;
487+
```
488+
489+
这里,`find .` 是指对当前目录(`.`)进行 `find`,并只列出文件(`-type f`)。`-exec` 后面的内容是要执行的命令,其中 `{}` 会被替换成找到的对象(文件、目录)的路径,`\;` 表示对每个对象都执行一次给定的命令,即实际运行的是
490+
491+
```shell
492+
md5sum file1
493+
md5sum file2
494+
md5sum file3
495+
...
496+
```
497+
498+
如果将 `\;` 换成 `+`,那么就是将文件名称收集起来一并交给要执行的命令,即
499+
500+
```shell
501+
md5sum file1 file2 file3 ...
502+
```
503+
504+
### `du` 命令 {#cmd-du}
505+
506+
`du` 命令可以统计文件和目录的大小。目录的大小是无法直接获取的,需要统计里面所有的文件和子目录的大小之后加和才能得到。`du` 命令的输出类似这样:
507+
508+
```shell
509+
$ du -h /etc/
510+
4.0K /etc/initramfs-tools/hooks
511+
8.0K /etc/initramfs-tools/conf.d
512+
4.0K /etc/initramfs-tools/scripts/local-premount
513+
4.0K /etc/initramfs-tools/scripts/nfs-premount
514+
... (省略)
515+
4.0K /etc/initramfs-tools/scripts/panic
516+
4.0K /etc/initramfs-tools/scripts/local-top
517+
44K /etc/initramfs-tools/scripts
518+
72K /etc/initramfs-tools
519+
12K /etc/udisks2
520+
16K /etc/fonts/conf.d
521+
60K /etc/fonts/conf.avail
522+
84K /etc/fonts
523+
```
524+
525+
由于前面说到的原因,`du` 需要先递归进入子目录,处理完其中所有的项目之后,才能回到上层目录并显示上层目录的总大小。类似 `ls -h`,这里的 `-h` 表示以人类可读的方式进行显示,`-b` 则可以显示字节数,`-a` 可以使得输出包含文件的大小(默认只显示各层级目录的大小)。
526+
527+
### `ncdu` 命令 {#cmd-ncdu}
528+
529+
`ncdu` 命令可以以图形化和交互式的方式显示目录的内容和大小,并可以用左右方向键浏览目录,类似 Windows 的文件资源管理器。这非常便于观察哪个目录占用了较大的磁盘空间。
530+
531+
```plain
532+
ncdu 1.18 ~ Use the arrow keys to navigate, press ? for help
533+
--- /home/xxxxxx(略去) -----------------
534+
/..
535+
53.1 MiB [##########] /main
536+
45.4 MiB [######## ] Contents-riscv64.gz
537+
40.6 MiB [####### ] /universe
538+
580.0 KiB [ ] /multiverse
539+
44.0 KiB [ ] /restricted
540+
8.0 KiB [ ] InRelease
541+
8.0 KiB [ ] Release
542+
4.0 KiB [ ] Release.gpg
543+
544+
Total disk usage: 139.7 MiB Apparent size: 139.6 MiB Items: 29
545+
```
546+
458547
## 思考题 {#questions}
459548

460549
!!! question "nobody 用户"

0 commit comments

Comments
 (0)