@@ -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