使用 UNIX find 命令的高级技术( 二 )


$ find $HOME/. -name *.txt -ok rm {} ;
它列出了查找到的每个文件,并且系统将暂停以等待您输入 Y 或者 y 。如果您按下 Enter 键,系统将不会删除该文件 。清单 1 显示了一些示例结果:
清单 1. 示例结果
< rm ... /home/bill/./.kde/share/apps/karm/karmdata.txt > ?
< rm ... /home/bill/./archives/LDDS.txt > ?
< rm ... /home/bill/./www/txt/textfile1.txt > ?
< rm ... /home/bill/./www/txt/faq.txt > ?
< rm ... /home/bill/./www/programs/MIKE.txt > ?
< rm ... /home/bill/./www/programs/EESTRING.txt > ?
.
.
.
系统将在每个问号之后暂停,在本示例中,每次都按下了 Enter 键以继续处理下一个文件 。(没有删除任何文件 。)-ok 参数允许您控制每个查找到的文件的自动化处理过程,这样就添加了一种避免自动删除文件的安全措施 。
如果在使用 -ok 参数时涉及到过多的文件,那么一个好的方法是先运行带 -exec 的 find 命令以列出所有将要删除的文件,然后在经过检查确保其中不会删除重要的文件后,再次运行该命令,其中用 rm 代替 ls 。
-exec 和 -ok 都非常有用,您必须确定在当前情况下哪一个能够更好的工作 。请记住,安全第一!
创造性地使用 find
您可以使用 find 命令执行各种各样的任务 。本部分内容提供了使用 find 命令来管理文件系统的几种方式的示例 。
为了保持简单,这些示例都避免了使用涉及通过管道将一个命令的输出传递到另一个命令的 -exec 命令 。然而,您完全可以根据自己需要在 find 命令的 -exec 子句中使用这样的命令 。
清除临时文件
您可以使用 find 命令来清除目录或子目录中在正常使用过程中生成的临时文件,这样可以节省磁盘空间 。要实现该操作,请使用下面的命令:
$ find . ( -name a.out -o -name '*.o' -o -name 'core' ) -exec rm {} ;
括号中的文件掩码 标识出了需要删除的文件类型,每个文件掩码的前面都有 -name 。该列表可以扩展为包括您需要清除的系统中的任何临时文件类型 。在代码的编译和连接过程中,程序员及其工具会生成示例中的那些文件类型:a.out、*.o 和 core 。其他的用户通常也会生成类似的临时文件,可以使用如 *.tmp、*.junk 等文件掩码来对命令进行相应的编辑 。您可能还发现将命令放入一个称作 clean 的脚本中非常有用,当需要清除一个目录中的内容的时候就可以执行该脚本 。
复制目录中的内容
find 命令允许您复制目录中的全部内容,同时保持每个文件和子目录的权限、时间和所有权 。要完成该操作,需要组合使用 find 和 cpio 命令,如下所示:
清单 2. 组合使用 find 和 cpio 命令
$ cd /path/to/source/dir
$ find . | cpio -pdumv /path/to/destination/dir
cpio 命令是一个复制命令,它设计用来将文件复制到或复制出一个 cpio 或 tar 存档文件,并自动地保持文件和子目录的权限、时间和所有权 。
列出文本文件的第一行内容
有些人使用每个文本文件的第一行作为标题或者文件内容的描述 。可以使用列出文件名和所有文本文件第一行内容的报表更方便地对大量的文本文件进行筛选 。下面的命令在报表中列出了您的 home 目录中所有文本文件的第一行内容,便于进一步地根据需要使用 less 命令进行检查:
清单 3. less 命令
$ find $HOME/. -name *.txt -exec head -n 1 -v {} ; > report.txt
$ less < report.txt
维护 LOG 和 TMP 文件的存储空间
要为生成大量文件的应用程序维护 LOG 和 TMP 文件存储空间,可以将下列命令放入到每天运行的 cron 任务中:
清单 4. 维护 LOG 和 TMP 文件存储空间
$ find $LOGDIR -type d -mtime0 -exec compress -r {} ;

推荐阅读