Shell 检查目录以及其中的文件与子目录,我们处理得最多的一个问题就是查找放错地方的文件并整理凌乱的文件层次结构。本章中,我们会讲到检查部分文件系统并展现其内容的一些技巧。
预备知识
我们之前讨论过的find
命令以及循环能够帮助检查并报告目录及其内容。
实战演练
有两种方法可以检查目录。一种方法是将目录层次以树状形式显示出来,另一种方法是生成目录下所有文件和子目录的汇总信息。
- 生成目录的树状视图
有时候,如果文件系统以图形化形式呈现,会更容易形成直观的印象。
接下来的例子中综合运用了我们讲过的多种工具。其中使用find
命令生成了当前目录下所有文件及子目录的列表。
-exec
选项创建了一个子shell,在这个子shell中使用echo
命令将文件名发送给tr
命令的stdin
。这里用到了两个tr
命令。第一个tr
删除了所有的字母数字字符、连字符(-
)、下划线(_
)和点号(.
),只将路径中的斜线(/
)传入第二个tr
,后者将这些斜线全部转换成空格。最后,利用basename
命令去掉文件名前的路径部分并将结果显示出来。
下面来查看目录/var/log的树状视图:
$ cd /var/log
$ find . -exec sh -c 'echo -n {} | tr -d "[:alnum:]_.\-" | \
tr "/" " "; basename {}' \;
生成如下输出:
mail
statistics
gdm
::0.log
::0.log.1
cups
error_log
access_log
... access_l
- 生成文件及子目录的汇总信息
我们可以结合find
、echo
和wc
生成子目录列表以及其中的文件数量。下面的命令可以获得当前目录下文件的汇总信息:
for d in `find . -type d`;
do
echo `find d -type f | wc -l` files ind;
done
如果在/var/log下执行该脚本,会生成如下输出:
103 files in .
17 files in ./cups
0 files in ./hp
0 files in ./hp/tmp