设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

15个高级的Linux find命令示例

2013-10-9 11:28| 发布者: 红黑魂| 查看: 1264| 评论: 0|来自: 51cto

摘要: 前阵子,我们审查了15件实事 find命令的例子(第一部分)。查找命令可以做很多比只是在寻找基于名称的文件 (第2部分)在这篇文章中,让我们来讨论15高级find命令的例子, 包括-根据它访问,修改或改变的时间查找文 ...

执行任何Unix的shell命令

执行你自己写的shell脚本,参数就是每个查找出来的文件名

例9:在find命令输出上使用 ls -l, 列举出1小时内被编辑过的文件的详细信息

  1. # find -mmin -60 
  2. ./cron 
  3. ./secure 
  4. # find -mmin -60 -exec ls -l {} \; 
  5. -rw-------  1 root root 1028 Jun 21 15:01 ./cron 
  6. -rw-------  1 root root 831752 Jun 21 15:42 ./secure 

例10:仅仅在当前文件系统中搜索

系统管理员有时候仅仅想在/挂载的文件系统分区上搜索,而不想去搜索其他的挂载分区,比如/home/挂载分区。如果你有多个分区被挂载了,你想在/下搜索,一般可以按下面的这样做

下面这个命令会搜索根目录/及其子目录下所有.log结尾的文件名。如果你有多个分区在/下面,那么这个搜索会去搜索所有的被挂载的分区:

  1. # find / -name "*.log" 

如果我们使用-xdev选项,那么仅仅会在在当前文件系统中搜索,下面是在xdev的man page上面找到的一段-xdev的定义:

  1. -xdev Don’t descend directories on other filesystems. 

下面的命令会在/目录及其子目录下搜索当前文件系统(也就是/挂载的文件系统)中所有以.log结尾的文件,也就是说如果你有多个分区挂载在/下面,下面的搜索不会去搜索其他的分区的(比如/home/)

  1. # find / -xdev -name "*.log" 

例11: 在同一个命令中使用多个{}

linux手册说命令中只能使用一个{},不过你可以像下面这样在同一个命令中使用多个{}

  1. # find -name "*.txt" cp {} {}.bkup \; 

注意,在同一个命令中使用这个{}是可以的,但是在不同的命令里就不行了,也就是说,如果你想象下面这样重命名文件是行不通的

  1. find -name "*.txt" -exec mv {} `basename {} .htm`.html \; 

例12: 使用多个{}实例

你可以像下面这样写一个shell脚本去模拟上面那个重命名的例子

  1. # mv "$1" "`basename "$1" .htm`.html" 

上面的双引号是为了防止文件名中出现的空格,不加的话会有问题。然后你把这个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"的错误消息, 就像下面这样:

  1. $ find / -name "*.conf" 
  2. /sbin/generate-modprobe.conf 
  3. find: /tmp/orbit-root: Permission denied 
  4. find: /tmp/ssh-gccBMp5019: Permission denied 
  5. find: /tmp/keyring-5iqiGo: Permission denied 
  6. find: /var/log/httpd: Permission denied 
  7. find: /var/log/ppp: Permission denied 
  8. /boot/grub/grub.conf 
  9. 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 
  3. /boot/grub/grub.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中

  1. # find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \ 
  2. \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \) 

Find命令示例(第一部分)

若你喜欢这篇关于find命令的Daddy文章,别忘了看看第一部分的关于find命令的Mommy文章:15个实用的Linux find命令示例

原文链接:http://www.thegeekstuff.com/2009/06/15-practical-unix-linux-find-command-examples-part-2/


酷毙
1

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部