@@ -455,6 +455,95 @@ graph LR
455
455
- `/var/run`:存储程序运行时的数据(部分发行版会将该目录符号链接到 `/run` 目录)。
456
456
- `/var/spool`:存储「等待进一步处理」的程序数据。
457
457
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
+
458
547
## 思考题 {#questions}
459
548
460
549
!!! question "nobody 用户"
0 commit comments