在查找到的文件列表结果上直接执行命令: 这之前你已经看到了如果通过find命令去查找各种条件的文件列表。如果你对这些find命令还不熟悉,我建议你 看完上面的第一部分接下来这部分我们向你介绍如果在find命令上执行各种不同的命令,也就是说如何去操作 find命令查找出来的文件列表。我们能在find命令查找出来的文件名列表上指定任意的操作: 其中的OPERATION可以是任意的命令,下面列举一下比较常用的: - rm 命令,用于删除find查找出来的文件
- mv 命令,用于重命名查找出的文件
- ls -l 命令,显示查找出的文件的详细信息
- md5sum, 对查找出的文件进行md5sum运算,可以获得一个字符串,用于检测文件内容的合法性
- wc 命令,用于统计计算文件的单词数量,文件大小等待
- 执行任何Unix的shell命令
- 执行你自己写的shell脚本,参数就是每个查找出来的文件名
例9:在find命令输出上使用 ls -l, 列举出1小时内被编辑过的文件的详细信息6 | -rw------- 1 root root 1028 Jun 21 15:01 ./ cron |
7 | -rw------- 1 root root 831752 Jun 21 15:42 ./secure |
例10:仅仅在当前文件系统中搜索系统管理员有时候仅仅想在/挂载的文件系统分区上搜索,而不想去搜索其他的挂载分区,比如/home/ 挂载分区。如果你有多个分区被挂载了,你想在/下搜索,一般可以按下面的这样做 下面这个命令会搜索根目录/及其子目录下所有.log结尾的文件名。如果你有多个分区在/下面,那么这个搜索会 去搜索所有的被挂载的分区: 如果我们使用-xdev选项,那么仅仅会在在当前文件系统中搜索,下面是在xdev的man page上面找到的一段 -xdev的定义: - -xdev Don’t descend directories on other filesystems.
下面的命令会在/目录及其子目录下搜索当前文件系统(也就是/挂载的文件系统)中所有以.log结尾的文件,也就 是说如果你有多个分区挂载在/下面,下面的搜索不会去搜索其他的分区的(比如/home/)
例11: 在同一个命令中使用多个{} linux手册说命令中只能使用一个{},不过你可以像下面这样在同一个命令中使用多个{} 注意,在同一个命令中使用这个{}是可以的,但是在不同的命令里就不行了,也就是说,如果你想象下面这样 重命名文件是行不通的 1 | find -name "*.txt" - exec mv {} ` basename {} .htm`.html \; |
例12: 使用多个{}实例你可以像下面这样写一个shell脚本去模拟上面那个重命名的例子 上面的双引号是为了防止文件名中出现的空格,不加的话会有问题。然后你把这个shell脚本保存为mv.sh,你可以像下面这样使用find命令了1 | find -name "*.html" - exec ./ mv .sh '{}' \; |
所以,任何情况下你在find命令执行中想使用同一个文件名多次的话,先写一个脚本,然后在find中通过-exec 执行这个脚本,把文件名参数传递进去就行,这是最简单的办法
例13: 将错误重定向到/dev/nul 重定向错误输出一般不是什么好的想法。一个有经验的程序员懂得在终端显示错误并及时修正它是很重要的。 尤其是在find命令中重定向错误不是个好的实践。 但是如果你确实不想看到那些烦人的错误,想把错误都重定 向到null设备中(也就是linux上的黑洞装置,任何丢进去的东西消失的无影无踪了)。你可以像下面这样做 1 | find -name "*.txt" 2>>/dev/null |
有时候这是很有用的。比如,如果你想通过你自己的账号在/目录下查找所有的*.conf文件,你会得到很多很多的"Permission denied"的错误消息, 就像下面这样:01 | $ find / -name "*.conf" |
02 | /sbin/generate-modprobe.conf |
03 | find : /tmp/orbit-root: Permission denied |
04 | find : /tmp/ ssh -gccBMp5019: Permission denied |
05 | find : /tmp/keyring-5iqiGo: Permission denied |
06 | find : /var/log/httpd: Permission denied |
07 | find : /var/log/ppp: Permission denied |
09 | find : /var/log/audit: Permission denied |
10 | find : /var/log/squid: Permission denied |
11 | find : /var/log/samba: Permission denied |
12 | find : /var/cache/alchemist/printconf.rpm/wm: Permission denied |
13 | [Note: There are two valid *.conf files burned in the "Permission denied" messages] |
你说烦人不?所以,如果你只想看到find命令真实的查找结果而不是这些"Permission denied"错误消息, 你可以将这些错误消息重定向到/dev/null中去1 | $ find / -name "*.conf" 2>>/dev/null |
2 | /sbin/generate-modprobe.conf |
4 | [Note: All the "Permission denied" messages are not displayed] |
例14: 将文件名中的空格换成下划线 你从网上下载下来的音频文件的文件名很多都带有空格。但是带有空格的文件名在linux(类Unix)系统里面 是很不好的。你可以使用find然后后面加上rename命令的替换功能去重命名这些文件,将空格转换成下划线 下面显示怎样将所有mp3文件的文件名中的空格换成_ 1 | $ find . - type f -iname “*.mp3″ - exec rename “s/ /_/g” {} \; |
例15: 在find结果中同时执行两条命令在find的man page页面中,下面是一次文件查找遍历中使用两条命令的语法举例 下面的find命令的例子,遍历文件系统一次,列出拥有setuid属性的文件和目录,写入/root/suid.txt文件, 如果文件大小超过100M,将其记录到/root/big.txt中
2 | \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \) |
Find命令示例(第一部分) 若你喜欢这篇关于find命令的Daddy文章,别忘了看看第一部分的关于find命令的Mommy文章。
|