上篇文章详细介绍了linux系统中查找文件的工具或者命令程序locate和find命令的基本操作。那么,今天这篇文章紧接着查找文件相关操作内容介绍。
Find命令所属操作列表中的条目,有助于我们想要的结果输出。上篇文章已讲到find 命令是基于搜索结果来执行操作命令程序。
预定义操作描述:
操作 |
描述 |
-delete |
删除当前匹配的文件 |
-ls |
对匹配的文件执行等同的ls -dils 命令。并将结果发送到标准输出 |
|
把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是默认操作 |
-quit |
一旦找到一个匹配,退出 |
例如:
find ~
find ~ -print
//此命令将home家目录中包含的每个文件和子目录输出。以一个列表的形式输出。两种命令的输出完全一致。
删除特定条件的文件
使用find 命令可以删除符合一定条件的文件。
例如:
find ~ -type f -name '*.BAK' -delete
//删除扩展名为“.BAK”(这通常用来指定备份文件)的文件, 在用户家目录及它的子目录下搜索以.BAK 结尾的文件名。一旦以.BAK 结尾的文件被找到后,就删除它们。
备注:当使用-delete 操作命令时,你肯定会格外小心。那我们怎么做更妥当呢?妥当的做法是我们可以先使用print程序命令测试下,是否符合我们要的搜索结果。
逻辑关系—逻辑运算符
例如:
find ~ -type f -and -name '*.BAK' -and -print
这个程序命令一旦被执行,它就会搜索以.BAK后缀的相关文件,并将符合条件文件的相对路径名称标准输出给我们。命令执行的原因是由每个测试和操作之间的逻辑关系决定的。
那么逻辑运算符是如何影响命令如何执行的呢?
测试/行为 |
只有... 的时候,才被执行 |
|
只有-type f and -name ’*.BAK’ 为真的时候 |
-name |
‘*.BAK’ 只有-type f 为真的时候 |
-type f |
总是被执行,因为它是与-and 关系中的第一个测试/行为 |
此表可以看出测试和行为之间的逻辑关系决定了哪一个会被先执行,同时测试和行为的顺序也很重要。
我们重新调整下测试和行为之间的顺序:让-print 行为是第一个,那么结果会截然不同:
例如:
find ~ -print -and -type f -and -name '*.BAK'
上述命令会输出每个文件(-print 行为总是为真),然后才是测试文件类型和指定的文件扩展名。
用户定义操作
除了预定义的操作外,我们可以调用任意的命令。通常情况下是通过-exec 命令。
例如:
-exec command {} ;
command 代表一个命令的名字,{} 代表当前路径名的符号表示,分号代表必要的分隔符,表明命令的结束。
当然,如何交互式地执行一个用户定义的操作行为?通过使用-ok 操作来代替-exec,它在执行每个指定的命令之前,会提示用户:
find ~ -type f -name 'foo*' -ok ls -l '{}' ';'
< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
Xargs命令
xargs 命令的用法—将标准输入或管道构造的参数列表转换成某一特定命令的参数列表并运行该特定命令。通俗的来讲就是xargs取其中一个命令的输出结果作为另外一个命令的参数列表来执行。对于我们的例子,我们可以这样使用它:
find ~ -type f -name 'foo*' -print | xargs ls -l
-rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
这里我们可以得到一个结论:
find命令的执行结果通过管道符|传递给xargs命令,然后,xargs命令将find命令的输出结果作为ls命令的参数,最后再执行ls -l命令。
备注:当某一命令行中的参数列表数量是有限制的,一旦超过linux系统支持的最大长度时,那么xargs命令将会执行该命令,然后一直重复这个过程直到耗尽标准输入。
接下来咱们再看下如何创建一个包含许多子目录和文件:
[root@linuxprobe~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[root@linuxprobe~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}
Linux命令的强大功能真是令人惊叹啊!仅仅用了这两行命令,就可以创建一个包含一百个子目录,而且每个子目录中包含了26 个空文件。
现在咱们看看Linux命令是如何实现这个奇迹的!
一个简单的mkdir命令,一个特异的shell 扩展(花括号)包括一个touch命令。通过组合mkdir 命令和-p 参数选项(导致mkdir 命令创建指定路径的父目录),以及花括号,这样的话就能够创建一百个目录。
备注:touch命令通常是用来设置或更新文件的访问,更改,和修改时间的属性。
今天关于linux系统文件查找命令的运用介绍就暂时结束了。locate,updatedb,find 和xargs 命令都是GNU 项目findutils的一部分。这个GUN 项目提供了大量的相当出色的在线文档,我们都需要好好拜读下这些文档。所以强烈建议大家可以参考下《linux就该这么学》这本书,对于linux系统文件管理层面的介绍很详细!