Unix中的find 命令不仅能够简单地用来定位文件,还可以自动地执行其他UNIX 命令的序列,其中使用所查找到的文件名作为输入。 UNIX 的 find 命令可以删除、复制、移动和执行其查找到的文件。另外,使用 -exec 参数可以根据您所需要的 UNIX 命令的序列来自动地运行这些文件。它甚至可以在对任何文件执行这些操作前,进一步让您进行确认。
与大多数 UNIX 命令一样,UNIX find 命令具有一长串令人生畏的选项和开关,它们会阻碍人们深入地学习该命令,但正是因为其范围广阔,真正的Explorer并不会被它们吓倒。一条好的通用原则在简化一个复杂问题时都会经过漫长的过程。启动一个xterm,并尝试执行下面的命令:
$ find . -name *.gif -exec ls {} ;
-exec 参数中包含了真正有价值的操作。当查找到匹配搜索条件的文件时,-exec 参数定义了将对这些文件进行什么操作。
该示例告诉计算机进行如下操作:
1. 从当前文件夹开始往下搜索,紧跟在 find 之后,使用点号 (.)。
2. 定位所有名称以 .gif 结尾的文件(图形文件)。
3. 列出所有查找到的文件,使用ls 命令。
需要对 -exec 参数进行更深入地研究。当查找到匹配搜索条件的文件名时,find 命令执行 ls {} 字符串,用文件名和路径代替文本 {}。
假设在搜索中查找到saturn.gif 文件,find 将执行如下所示的命令: $ ls ./gif_files/space/solar_system/saturn.gif 本文余下的内容建立在这条一般原则之上:仔细地使用 find 命令可以让 UNIX 文件系统的管理工作变得更加容易。例如,如果您使用了 -fstype 参数,find 命令可以根据查找到的文件所处的文件系统的类型来对命令进行相应的处理。
在 find 命令对查找到的文件执行相应命令前将对您进行提示,这通常是非常有用的,您可以使用 -ok 参数告诉它继续执行该操作,接下来我们将对其进行介绍。 可选的执行 -ok 是 -exec 参数的一个重要的替代项,它的行为和 -exec 一样,但它会提示您是否要对文件运行相应的命令。
假设您想要删除 home 目录中的大部分 .txt 文件,但希望能够逐个文件地执行该操作。像 UNIX 中的 rm 命令那样的删除操作是很危险的,因为当使用像 find 这样的自动化处理方式来查找文件时,它可能一不小心会删除重要的文件,您也许希望在删除这些系统查找到的文件之前对其进行仔细检查。
下面的命令列出了您的 home 目录中所有的 .txt 文件。要删除这些文件,必须在 find 命令通过列出文件名提示您确认操作时输入 Y 或者 y: $ find $HOME/. -name *.txt -ok rm {} ; 它列出了查找到的每个文件,并且系统将暂停以等待您输入 Y 或者 y。如果您按下 Enter 键,系统将不会删除该文件。
-ok 参数允许您控制每个查找到的文件的自动化处理过程,这样就添加了一种避免自动删除文件的安全措施。
如果在使用 -ok 参数时涉及到过多的文件,那么一个好的方法是先运行带 -exec 的 find 命令以列出所有将要删除的文件,然后在经过检查确保其中不会删除重要的文件后,再次运行该命令,其中用 rm 代替 ls。 -exec 和 -ok 都非常有用,您必须确定在当前情况下哪一个能够更好的工作。请记住,安全第一!
您可以使用 find 命令来清除目录或子目录中在正常使用过程中生成的临时文件,这样可以节省磁盘空间。要实现该操作,请使用下面的命令: $ find . ( -name a.out -o -name '*.o' -o -name 'core' ) -exec rm {} ; 括号中的文件掩码 标识出了需要删除的文件类型,每个文件掩码的前面都有 -name。该列表可以扩展为包括您需要清除的系统中的任何临时文件类型。在代码的编译和连接过程中,程序员及其工具会生成示例中的那些文件类型:a.out、*.o 和 core。其他的用户通常也会生成类似的临时文件,可以使用如 *.tmp、*.junk 等文件掩码来对命令进行相应的编辑。
find 命令允许您复制目录中的全部内容,同时保持每个文件和子目录的权限、时间和所有权。要完成该操作,需要组合使用 find 和 cpio命令。
标签: