我们处理得最多的一个问题就是查找放错地方的文件并整理凌乱的文件层次结构。在这则攻略中,我们会讲到检查部分文件系统并展现其内容的一些技巧。

2.17.1 预备知识

我们之前讨论过的find命令以及循环能够帮助检查并报告目录及其内容。

2.17.2 实战演练

有两种方法可以检查目录。一种方法是将目录层次以树状形式显示出来,另一种方法是生成目录下所有文件和子目录的汇总信息。

1. 生成目录的树状视图

有时候,如果文件系统以图形化形式呈现,会更容易形成直观的印象。接下来的例子中综合运用了我们讲过的多种工具。其中使用find命令生成了当前目录下所有文件及子目录的列表。

-exec选项创建了一个子shell,在这个子shell中使用echo命令将文件名发送给tr命令的stdin。这里用到了两个tr命令。第一个tr删除了所有的字母数字字符、连字符(-)、下划线
_)和点号(.),只将路径中的斜线(/)传入第二个tr,后者将这些斜线全部转换成空格。最后,利用basename命令去掉文件名前的路径部分并将结果显示出来。

下面来查看目录/var/log的树状视图:

  1. $ cd /var/log
  2. $ find . -exec sh -c 'echo -n {} | tr -d "[:alnum:]_.\-" | \
  3. tr "/" " "; basename {}' \;

生成如下输出:

  1. .
  2. dnf.librepo.log
  3. sa
  4. journal
  5. nginx.service.log
  6. mariadb.service.log
  7. private
  8. dnf.log
  9. wtmp
  10. lastlog
  11. nginx
  12. access.log
  13. error.log
  14. ...

2. 生成文件及子目录的汇总信息

我们可以结合findechowc(下一章会详细讲解该命令)生成子目录列表以及其中的文
件数量。

下面的命令可以获得当前目录下文件的汇总信息:

  1. for d in `find . -type d`;
  2. do
  3. echo `find $d -type f | wc -l` files in $d;
  4. done

如果在/var/log下执行该脚本,会生成如下输出:

  1. 24 files in .
  2. 0 files in ./sa
  3. 2 files in ./journal
  4. 0 files in ./private
  5. 2 files in ./nginx
  6. 12 files in ./anaconda
  7. 1 files in ./redis
  1. [root@dev log]# for d in `find . -type d`;
  2. > do
  3. > echo `find $d -type f | wc -l` files in $d;
  4. > done
  5. 24 files in .
  6. 0 files in ./sa
  7. 2 files in ./journal
  8. 0 files in ./private
  9. 2 files in ./nginx
  10. 12 files in ./anaconda
  11. 1 files in ./redis
  12. [root@dev log]#