设为首页收藏本站

LUPA开源社区

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

爹地,我找到了!, 15个极好的Linux find命令示例

2013-9-29 09:32| 发布者: 红黑魂| 查看: 857| 评论: 0|来自: 开源中国编译

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

在查找到的文件列表结果上直接执行命令:

这之前你已经看到了如果通过find命令去查找各种条件的文件列表。如果你对这些find命令还不熟悉,我建议你

看完上面的第一部分接下来这部分我们向你介绍如果在find命令上执行各种不同的命令,也就是说如何去操作

find命令查找出来的文件列表。我们能在find命令查找出来的文件名列表上指定任意的操作:

1# find -exec \;

其中的OPERATION可以是任意的命令,下面列举一下比较常用的:

  •  rm 命令,用于删除find查找出来的文件
  •  mv 命令,用于重命名查找出的文件
  •  ls -l 命令,显示查找出的文件的详细信息
  •  md5sum, 对查找出的文件进行md5sum运算,可以获得一个字符串,用于检测文件内容的合法性
  •  wc 命令,用于统计计算文件的单词数量,文件大小等待
  •  执行任何Unix的shell命令
  •  执行你自己写的shell脚本,参数就是每个查找出来的文件名

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

1# find -mmin -60
2./cron
3./secure
4 
5# find -mmin -60 -exec ls -l {} \;
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结尾的文件名。如果你有多个分区在/下面,那么这个搜索会

去搜索所有的被挂载的分区:

1# find / -name "*.log"

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

-xdev的定义:

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

下面的命令会在/目录及其子目录下搜索当前文件系统(也就是/挂载的文件系统)中所有以.log结尾的文件,也就

是说如果你有多个分区挂载在/下面,下面的搜索不会去搜索其他的分区的(比如/home/)

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

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

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

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

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

重命名文件是行不通的

1find -name "*.txt" -exec mv {} `basename {} .htm`.html \;
例12: 使用多个{}实例

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

1# mv "$1" "`basename "$1" .htm`.html"
上面的双引号是为了防止文件名中出现的空格,不加的话会有问题。然后你把这个shell脚本保存为mv.sh,
你可以像下面这样使用find命令了
1find -name "*.html" -exec ./mv.sh '{}' \;
所以,任何情况下你在find命令执行中想使用同一个文件名多次的话,先写一个脚本,然后在find中通过-exec
执行这个脚本,把文件名参数传递进去就行,这是最简单的办法

例13: 将错误重定向到/dev/nul

重定向错误输出一般不是什么好的想法。一个有经验的程序员懂得在终端显示错误并及时修正它是很重要的。

尤其是在find命令中重定向错误不是个好的实践。 但是如果你确实不想看到那些烦人的错误,想把错误都重定

向到null设备中(也就是linux上的黑洞装置,任何丢进去的东西消失的无影无踪了)。你可以像下面这样做

1find -name "*.txt" 2>>/dev/null
有时候这是很有用的。比如,如果你想通过你自己的账号在/目录下查找所有的*.conf文件,你会得到很多很
多的"Permission denied"的错误消息, 就像下面这样:
01find / -name "*.conf"
02/sbin/generate-modprobe.conf
03find: /tmp/orbit-root: Permission denied
04find: /tmp/ssh-gccBMp5019: Permission denied
05find: /tmp/keyring-5iqiGo: Permission denied
06find: /var/log/httpd: Permission denied
07find: /var/log/ppp: Permission denied
08/boot/grub/grub.conf
09find: /var/log/audit: Permission denied
10find: /var/log/squid: Permission denied
11find: /var/log/samba: Permission denied
12find: /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中去
1find / -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文件的文件名中的空格换成_

1find . -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文章。 

参与翻译(3人)

酷毙

雷人

鲜花
1

鸡蛋

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

最新评论

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

返回顶部