http://blog.chinaunix.net/uid-7340476-id-225283.html
find命令主要用来在硬盘上搜索文件, find命令主要用于文件查找,列出当前目录及子目录下所有的文件和文件夹
格式:find path -option "keyword" [-print] [-exec -ok command] {} \;
path: 查找路径 ;该命令用于在指定路径中查找符合条件的文件,搜索路径可以是多个目录,不同目录之间用空格分割
-option: 选项
"keyword": 关键字
command: 需要执行的命令
-exec command] {} \;将查到的文件执行command操作,注意{}和\;之间有空格
-ok和-exec的作用一样,只是-ok在执行前会询问用户是否执行操作
find . -name "*" | xargs grep -i "passwd"(自己工作中用的最多的实例,-i的作用是不区分大小写)
find -name "t*" -perm 744 //查找当前目录下文件名以t开头的,且文件属性主具有读、写、执行权限的文件。。。。
find还有-exec选项,对匹配文件执行该参数过给出的shell命令。
例如:find /etc/ -type f -name "rc*" -exec ls -l {} \; //注意{}和\之间有空格。。。
由此可见:可以接多个选项参数
目录路径:表示以此目录作为根目录逐级往下搜索
1.目录介绍:
如果find不指定目录,则默认从当前所在的目录开始搜索
$find
$find .
以上两个结果一样
. 一个点表示当前目录,也可以使用 ./ 来表示;
.. 两个点表示父目录,也可以 ../ 来代表。
如果需要从根目录开始查找:/
find . 遍历输出当前目录下的所有文件(夹)及子文件(夹)
find / 遍历输出根目录下的所有文件(夹)及子文件(夹)
find ./ 遍历输出当前目录的下一级路径的所有文件(夹)及子文件(夹)
也可以是/opt/qmfsun之类的路径
find中的目录可以指定多个搜索目录
$ind /usr /home /tmp -name "*.java";在/usr /home /tmp三个目录中查找以.java结尾的文件
如果对某个目录没有访问权限的话,就会报错,提示: find: /tmp/qmfsun:Permission denide
2. 需要搜索的关键字
3.主要选项参数:
注意:
a)每一个选项前面跟随一个横杠-
$find /doc -name '*bak' -exec rm -rf {} \; //从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。
注意:-exec 选项是执行的意思,rm -rf是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。
find命令默认情况下是区分大小写的,可以通过-iname或者在grep中添加-i参数来忽略大小写
-name :指定按照文件名查找文件,查找时文件名大小写敏感。只能搜索到文件名,如果需要搜索文件内容里包含的特定字符串,需要用grep(用的最常见)
-iname: 查找时不区分文件名大小写
$ find . -iname U* users users2
#如果执行find . -name U*将不会找到匹配的文件
find -iname "MyCProgram.c";所有不区分大小写的文件名为“MyCProgram.c”的文件
查找当前用户主目录下的所有文件:下面两种方法都可以使用
find -perm,根据文件的权限来查找文件,有三种形式,是位"与", + /是位"或"
find -perm mode
find -perm -mode
find -perm /mode(+符号的作用与 / 符号相同,但是现在新版 GNU findutils 中不支持使用该符号)
三者区别:
-perm按文件权限查找。例如:-perm -777, -perm –a+x(user, group, other 都具有write属性)
find plsql -type f -perm -ug=rw -exec ls -l {} \; 2>/dev/null //将查找可由“other”和组写入的文件
或者
find plsql -type f -perm -220 -exec ls -l {} \; 2>/dev/null
-rw-rw-rw- 1 bluher users 4303 Jun 7 2004 plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan 12 2005 plsql/FORALLSample/doc/readme.html
-rw-rw-rw- 1 bluher users 22647 Jan 12 2005
find plsql -type f -perm /ug=rw -exec ls -l {} \; 2>/dev/null //查找由用户、组或二者共同写入的文件:
或者
find plsql -type f -perm /220 -exec ls -l {} \; 2>/dev/null
-rw-r--r-- 1 bluher users 21473 May 3 16:02 plsql/regexpvalidate.zip
-rw-rw-rw- 1 bluher users 4303 Jun 7 2004 plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan 12 2005 plsql/FORALLSample/doc/readme.html
-rw-rw-rw- 1 bluher users 22647 Jan 12 2005 plsql/FORALLSample/src/config.sql
find /etc -perm 640 精确匹配,其权限必须是640
find /etc -perm /640三组权限中有任意一组匹配都行
find /etc -perm -640含有该权限的都得匹配
-perm -222 可查找出666,只要含有222权限的都可以
-perm -400只要属主有读权限即可,其他任意权限
-perm /400属主有读权限,其他没有任何权限;符合这三组都可
find . -perm 700 是说恰好为 700, rwx------
find . -perm -700 是说第一组满足 7 就可以了,后两组无所谓,因此 rwx------ 和 rwxrwxrwx 都会入选
find . -perm +700 是说第一组每一位有一个满足就可以了,因此 r-x------ 也会入选,范围又扩大很多
# find . -perm 111 -print //表示在当前目录下搜寻所有者、同组成员及其他成员均为可执行权限的文件及文件夹# find . -perm -111 -print //表示在当前目录下搜寻所有者、同组成员及其他成员均含有可执行权限的文件及文件夹#find . -perm /111 -print //表示在当前目录下搜寻所有者、同组成员及其他成员中至少一个角色含有可执行权限的文件及文件夹
+ 针对 三个权限位中的任意 一位
- 针对 三个权限位中的全部 三位
MODE 也是针对三位的
[root@localhost ~]# ls -lh test
total 0
-r--r--r-- 1 root root 0 Oct 10 20:50 test1
-rwxr--r-- 1 root root 0 Oct 10 20:50 test2
-rw-r--r-- 1 root root 0 Oct 10 20:50 test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test4
[root@localhost ~]# find test -perm 644 | xargs ls -hld
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test4
[root@localhost ~]# find test -perm +644 |xargs ls -lhd
drwxr-xr-x 2 root root 1.0K Oct 10 20:50 test //找到这个,是因为find中没有指明查找的类型,即没有-type f的原因
-r--r--r-- 1 root root 0 Oct 10 20:50 test/test1
-rwxr--r-- 1 root root 0 Oct 10 20:50 test/test2
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test4
[root@localhost ~]# find test -perm -644 | xargs ls -lhd
drwxr-xr-x 2 root root 1.0K Oct 10 20:50 test
-rwxr--r-- 1 root root 0 Oct 10 20:50 test/test2
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test4
可以看到 a ab abc 的权限分别为600 640 666
find -perm 640 是做精确匹配,只会匹配到640即 ab
find -perm -640 做比640更充足的匹配,当然666是满足的,即 ab abc
find -perm /640 是要任意的一组权限中1的位置上有一个符合即可,因此a ab abc 都会匹配出来
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
find /apps -path "/apps/bin" -prune -o -print;希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找
find /usr/sam -path "/usr/sam/dir1" -prune -o -print;比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
find命令和and(多个参数选项连接符),or搭配使用b)这些选项可以多个一起用
$find -name "t*" -perm 744;查找当前目录下文件名以t开头的,且文件属性主具有读、写、执行权限的文件。。。。
$find /etc/ -type f -name "rc*" -exec ls -l {} \; (find还有-exec选项,对匹配文件执行该参数过给出的shell命令。)
$find /doc -user jacky -name 'j*' //从 /doc 目录开始往下找,找属主为jacky 的、文件名开头是 j的文件。
多条件查找:条件间的逻辑关系
并关系:-a
或关系:-o
非关系:!或者-not
例如:find /tmp -name "passwd" -user root(默认并关系)
-a
-o
!
避开多个文件夹
\ 表示转义字符,即指示 shell 不对后面的字符作特殊解释,转义字符。
查找某一确定文件,-name等选项加在-o 之后
在linux find 进行查找的时候,有时候需要忽略某些目录不查找,可以使用 -prune 参数来进行过滤,但必须要注意要忽略的路径参数必须紧跟着搜索的路径之后,否则该参数无法起作用。
以下是指定搜索/home/carryf目录下的所有文件,但是会忽略/home/carryf/astetc的路径:
find /home/carryf -path "/home/carryf/astetc" -prune -o -type f -print
如果按照文件名来搜索则为:
find /home/carryf -path "/home/carryf/astetc" -prune -o -type f -name "cdr_*.conf" -print
如果要忽略两个以上的路径如何处理?
find /home/carryf /( -path "/home/carryf/astetc" -o -path "/home/carryf/etc" /) -prune -o -type f -print
find /home/carryf /( -path "/home/carryf/astetc" -o -path "/home/carryf/etc" /) -prune -o -type f -name "cdr_*.conf" -print
注意/( 和/) 前后都有空格。
查找某个文件包含内容,下面这个语句可以解决目录带空格的问题:
find ./ -name "mysql*" -print0 |xargs -0 grep "SELECT lead_id FROM vicidial_list where vendor_lead_code"
如果目录不带空格,那么可以如下面的形式执行:
find ./ -name "mysql*" |xargs grep "SELECT lead_id FROM vicidial_list where vendor_lead_code"
-amin n 查找系统中最后N分钟访问的文件
-atime n 查找系统中最后n*24小时访问的文件
-cmin n 查找系统中最后N分钟被改变文件状态的文件
-ctime n 查找系统中最后n*24小时被改变文件状态的文件
-mmin n 查找系统中最后N分钟被改变文件数据的文件
-mtime n 查找系统中最后n*24小时被改变文件数据的文件
解释什么是atime ctime mtime
atime (access time):最后一次访问文件的时间
mtime(medify time):最后一次修改文件的时间
ctime(change time):最后一次改变文件(改变的是原数据即属性)的时间
如:记录该文件的inode节点被修改的时间。touch 命令除了-d -t选项外都会改变改时间,而且chmod,chown等命令也能改变该值
三者之间的关系
当修改mtime时,ctime必须随着改变,因为文件大小等属性;有人说atime 也一定会改变,要想修改文件必须先访问;其实是不对的,不必访问文件就能修改内容:如#echo "change it" >> /etc/inittab ,inittab文件内容会改变,但并没有访问文件,所以atime没有改变
查看三者的命令
stat filename 可以查看三者的时间值
ls -l filename 查看文件修改时间
ls -lc filename 查看文件状态改动时间
ls -lu filename 查看文件访问时间
-size +2M大于2M的文件
-size -1k小于1k的
-size 2M介于2M正负1M范围内的文件
$ find
/ -
type
f -name *.zip -size +100M -
exec
rm
-i {} \;(删除大于100M的*.zip文件)
-exec 操作允许 find 在它遇到的文件上执行任何 shell 命令。大括号允许移动每个空文件。
- -print: find命令将匹配的文件输出到标准输出。
- -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为"command { } \; ",注意"{ }"和“\;”之间的空格。
- -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
作用:用户使用这一选项是为了查找到旧文件并查看,删除它或者做其他的操作
exec和ok:
选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。任何形式的命令都可以在-exec选项中使用。
eg:
-prune剔除某个文件或者文件夹
$find . –path “/DSF” –prune –o –print
$find . \( -path “./DSF” –o “./file1” \) –prune –o –perm -444 -print
注意:-o 是或者,以此类推也可以用-a,-a是并且的意思。可根据相应的情况用-o 或者-a
实例1:ls -l命令放在find命令的-exec选项中
命令:
find . -type f -exec ls -l {} \;
输出:
[root@localhost test]# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log
-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log
-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log
-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log
-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log
[root@localhost test]#
说明:
上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
实例2:在目录中查找更改时间在n日以前的文件并删除它们
命令:
find . -type f -mtime +14 -exec rm {} \;
输出:
[root@localhost test]# ll
总计 328
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 33 10-28 16:54 log2013.log
-rw-r--r-- 1 root root 127 10-28 16:51 log2014.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
-rw-r--r-- 1 root root 25 10-28 17:02 log.log
-rw-r--r-- 1 root root 37 10-28 17:07 log.txt
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 10-28 14:47 test3
drwxrwxrwx 2 root root 4096 10-28 14:47 test4
[root@localhost test]# find . -type f -mtime +14 -exec rm {} \;
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
说明:
在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。
实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示
命令:
find . -name "*.log" -mtime +5 -ok rm {} \;
输出:
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;
< rm ... ./log_link.log > ? y
< rm ... ./log2012.log > ? n
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
说明:
在上面的例子中, find命令在当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除文件,按n键不删除。
实例4:-exec中使用grep命令
命令:
find /etc -name "passwd*" -exec grep "root" {} \;
输出:
[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@localhost test]#
说明:
任何形式的命令都可以在-exec选项中使用。 在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。
实例5:查找文件移动到指定目录
命令:
find . -name "*.log" -exec mv {} .. \;
输出:
[root@localhost test]# ll
总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:49 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# cd test3/
[root@localhost test3]# ll
总计 304
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
[root@localhost test3]# find . -name "*.log" -exec mv {} .. \;
[root@localhost test3]# ll
总计 0[root@localhost test3]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:50 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
实例6:用exec选项执行cp命令
命令:
find . -name "*.log" -exec cp {} test3 \;
输出:
[root@localhost test3]# ll
总计 0[root@localhost test3]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:50 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -name "*.log" -exec cp {} test3 \;
cp: “./test3/log2014.log” 及 “test3/log2014.log” 为同一文件
cp: “./test3/log2013.log” 及 “test3/log2013.log” 为同一文件
cp: “./test3/log2012.log” 及 “test3/log2012.log” 为同一文件
[root@localhost test]# cd test3
[root@localhost test3]# ll
总计 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test3]#
实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
命令:
find . -type f -print | xargs file
输出:
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -type f -print | xargs file
./log2014.log: empty
./log2013.log: empty
./log2012.log: ASCII text
[root@localhost test]#
实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中
命令:
find / -name "core" -print | xargs echo "" >/tmp/core.log
输出:
[root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/core.log
[root@localhost test]# cd /tmp
[root@localhost tmp]# ll
总计 16
-rw-r--r-- 1 root root 1524 11-12 22:29 core.log
drwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766
drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815
drwx------ 2 root root 4096 11-03 07:11 vmware-root
实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限
命令:
find . -perm -7 -print | xargs chmod o-w
输出:
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -perm -7 -print | xargs chmod o-w
[root@localhost test]# ll
总计 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 19:32 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]#
说明:
执行命令后,文件夹scf、test3和test4的权限都发生改变
实例4:用grep命令在所有的普通文件中搜索hostname这个词
命令:
find . -type f -print | xargs grep "hostname"
输出:
[root@localhost test]# find . -type f -print | xargs grep "hostname"
./log2013.log:hostnamebaidu=baidu.com
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#
实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词
命令:
find . -name \* -type f -print | xargs grep "hostnames"
输出:
[root@peida test]# find . -name \* -type f -print | xargs grep "hostnames"
./log2013.log:hostnamesina=sina.com
./log2013.log:hostnames=true[root@localhost test]#
说明:
注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。
实例6:使用xargs执行mv
命令:
find . -name "*.log" | xargs -i mv {} test4
输出:
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:54 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# cd test4/
[root@localhost test4]# ll
总计 0[root@localhost test4]# cd ..
[root@localhost test]# find . -name "*.log" | xargs -i mv {} test4
[root@localhost test]# ll
总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# cd test4/
[root@localhost test4]# ll
总计 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test4]#
实例7:find后执行xargs提示xargs: argument line too long解决方法:
命令:
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
输出:
[root@pd test4]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
rm -f
[root@pdtest4]#
说明:
-l1是一次处理一个;-t是处理之前打印出命令
实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]
命令:
输出:
[root@localhost test]# ll
总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# cd test4
[root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..
[root@localhost test4]# ll
总计 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test4]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]#
说明:
使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]
实例9:xargs的-p参数的使用
命令:
find . -name "*.log" | xargs -p -i mv {} ..
输出:
[root@localhost test3]# ll
总计 0
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
[root@localhost test3]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:06 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]# cd test3
[root@localhost test3]# find . -name "*.log" | xargs -p -i mv {} ..
mv ./log2015.log .. ?...y
[root@localhost test3]# ll
总计 0[root@localhost test3]# cd ..
[root@localhost test]# ll
总计 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
-rw-r--r-- 1 root root 0 11-13 06:06 log2015.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 06:08 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
[root@localhost test]#
find命令查找实例:
查找2004-11-30 16:36:37时更改过的文件
# A=`find ./ -name "*php"` | ls -l --full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"将find出来的东西拷到另一个地方
find *.c -exec cp '{}' /tmp ;比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名
A) find /tmp -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
B) grep SYSCALL_VECTOR /tmp/*.h | cut -d':' -f1| uniq > filenameC) find /tmp -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print
find /tmp -name tmp.txt -exec cat {} \;
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo "" > /tmp/core.logfind -name april* 在当前目录下查找以april开始的文件
find -name april* fprint file 在当前目录下查找以april开始的文件,并把结果输出到file中find -name ap* -o -name may* 查找以ap或may开头的文件find /mnt -name tom.txt -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件find /tmp -name wa* -type l 在/tmp下查找名为wa开头且类型为符号链接的文件find /home -mtime -2 在/home下查最近两天内改动过的文件find /home -atime -1 查1天之内被存取过的文件find /home -mmin +60 在/home下查60分钟前改动过的文件find /home -amin +30 查最近30分钟前被存取过的文件find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录find /home -user cnscn 列出/home目录内属于用户cnscn的文件或目录find /home -uid +501 列出/home目录内用户的识别码大于501的文件或目录find /home -group cnscn 列出/home内组为cnscn的文件或目录find /home -gid 501 列出/home内组id为501的文件或目录find /home -nouser 列出/home内不属于本地用户的文件或目录find /home -nogroup 列出/home内不属于本地组的文件或目录find /home -name tmp.txt -maxdepth 4 列出/home内的tmp.txt 查时深度最多为3层find /home -name tmp.txt -mindepth 3 从第2层开始查find /home -empty 查找大小为0的文件或空目录find /home -size +512k 查大于512k的文件find /home -size -512k 查小于512k的文件find /home -links +2 查硬连接数大于2的文件或目录find /home -perm 0700 查权限为700的文件或目录find /tmp -name tmp.txt -exec cat {} \;find /tmp -name tmp.txt -ok rm {} \;find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件find / -empty # 查找在系统中为空的文件或者文件夹find / -group cat # 查找在系统中属于 groupcat的文件find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件find / -mtime -1 #查找在系统中最后24小时里修改过的文件find / -nouser #查找在系统中属于作废用户的文件find / -user fred #查找在系统中属于FRED这个用户的文件
$find /etc -name "passwd*" -exec grep "cnscn" {} \; #看是否存在cnscn用户
Linux下find一次查找多个指定类型文件,指定文件或者排除某类文件,在 GREP 中匹配多个关键
|
- find . -name "a.html" -name "b.html"
- find . -regex '.*\.txt\|.*\.doc\|.*\.mp3'
- ./a.txt
- ./a.doc
- ./a.mp3
- find . -type f ! -name "*.html"
- find . -type f ! -name "*.html"
- ./ge.bak.02.09
- ./ge.html.changed.by.jack
- ./a.txt
- ./a.doc
- ./a.mp3
- find . -type f ! -name "*.html" -type f ! -name "*.php" -type f ! -name "*.svn-base" -type f ! -name "*.js" -type f ! -name "*.gif" -type f ! -name "*.png" -type f ! -name "*.cpp" -type f ! -name "*.h" -type f ! -name "*.o" -type f ! -name "*.jpg" -type f ! -name "*.so" -type f ! -name "*.bak" -type f ! -name "*.log"
- root@116.255.139.240:~/a# grep -r -E '0341028|100081|10086|10001' *
- a.txt:100081
- b.txt:10086
- c/cc.txt:0341028
- c/cc.txt:100081
- c/cc.txt:10086
- c/cc.txt:10001
- c.txt:10001
- d.txt:0341028
- grep -r -E -l '0341028|100081|10086|10001' *
- a.txt
- b.txt
- c/cc.txt
- c.txt
- d.txt
- find . -name "*.html" -o -name "*.js"|xargs grep -r "BusiTree"
- find . -name "*.php"|awk '{print "cat " $0 " |grep -H dbsys.mxxxx.justwinit.cn"}'|sh
find命令的复杂查找
#find . -size -10c –print | ls –l //在当前目录下查找100~200块长的文件并显示文件的实际块数。$find ./ -perm -002 -exec mv {} {}.old \; //将查找到文件的名字加上.old(相当于重命名)
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名A)find /tmp -name "*.h" | xargs n50 grep SYSCALL_VECTORB) grep SYSCALL_VECTOR /tmp/*.h | cut -d':' -f1| uniq > filenameC) find /tmp -name "*.h" -exec grep "SYSCALL_VECTOR" {} \;
# A='find ./ -name "*php"' | ls -l --full-time $A 2>/dev/null | grep "2004-11-30 16:36:37 //查找2004-11-30 16:36:37时更改过的文件$find / -name access_log 2 >/dev/null //无错误查找,所有的错误信息都被输入到/dev/null 目录
$ find . –print
-print指明打印出匹配文件的文件名(路径),’\n’作为分割符。使用-print0可指明使用’\0’作为分割符。
我们可根据文件名进行搜索,如搜索以.txt结尾的文件名:
$ find . –name “*.txt” –print
另外还有一个-iname选项,与-name选项的区别仅在于-iname选项忽略字母大小写。
如果想匹配多个条件中的一个,可以采用OR条件操作:
$ find . \( –name “*.txt” –o –name “*.pdf” \) –print
./new.txt
./new.pdf
上面的代码打印出所有的.txt和.pdf文件。\(以及\)用于将它们之中的内容视为一个整体。
选项-path(同样也有-ipath)将文件路径作为一个整体进行匹配,如:
$ find . –path “*new*” –print
./new.txt
./new.pdf
./new.py
选项-regex的参数和-path的类似,只不过-regex(同样也有-iregex)是基于正则表达式来匹配文件路径的。
$ find . –regex “.*\(\.txt\|\.pdf\)$” –print
./new.txt
./new.pdf
find也可以用”!”否定参数的含义,如:
$ find . ! –name “*.txt” –print
.
./new.pdf
./new.py
find命令在使用时会遍历所有的子目录。但可以使用-maxdepth和-mindepth来限制find命令遍历的深度。如:
$ find . maxdepth 1 –print
$ find . mindepth 2 –print
-maxdepth和-mindepth应该作为find的第3个参数出现。如果作为第4个或之后的参数,就可能会影响到find的效率,因为它不得不进行一些不必要的检查。
Linux中文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字以及FIFO等。Find命令中的-type可以对文件搜索进行过滤。如:
$ find . –type d –print #列出所有的目录
$ find . –type f –print #列出普通文件
$ find . –type l –print #列出符号链接
$ find . –type c –print #列出字符设备
$ find . –type b –print #列出块设备
$ find . –type s –print #列出套接字
$ find . –type p –print #列出FIFO
Linux文件系统中的每一个文件都有三种时间戳:
l 访问时间(-atime):用户最近一次访问文件的时间。
l 修改时间(-mtime):文件内容最后一次被修改的时间。
l 变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。
-atime、-mtime、-ctime可作为find的时间参数,它们可以整数值给出,单位是天。这些整数值还可以带有-或+,如:
$ find . type f –atime -7 -print #打印最近7天被访问过的所有文件
$ find . type f –atime 7 –print #打印恰好在7天前被访问过的所有文件
$ find . type f –atime +7 –print #打印出访问时间超过7天的所有文件
另外,还有以分钟作为计量单位的,包括:
l -amin(访问时间)
l -mmin(修改时间)
l -cmin(变化时间)
find命令还有一个-newer参数,使用-newer,可以指定一个用于比较时间戳的参考文件,如:
$ find . –type f –newer new.txt –print #打印比file.txt修改时间更新的所有文件
find还可以根据文件大小搜索:
$ find . –type f –size +2k #大于2KB的文件
$ find . –type f –size -2k #小于2KB的文件
$ find . –type f –size 2k #大小等于2KB的文件
除了k之外,还有:
l b——块(512字节)。
l C——字节。
l w——字(2字节)。
l k——千字节。
文件匹配还可以根据文件权限进行,如:
$ find . –type f –perm 644 –print #打印出权限为644的文件
还可以用该方法找出那些没有设置好权限执行权限的PHP文件:
$ find . type f –name “*.php” ! –perm 644 –print
也可以根据文件的所有权进行搜索,如:
$ find . –type f –user baojie –print #打印用户baojie拥有的所有文件
find命令可以借助选项-exec与其他命令进行结合,如将所有.py添加可执行权限:
$ find . –name “*.py” –exec chmod +x {} \;
{}是一个特殊的字符串,与-exec选项结合使用。对于每一个匹配的文件,{}会被替换成响应的文件名。
无法在-exec参数中直接使用多个命令,但可以把多个命令写到一个shell脚本中,然后再-exec中使用这个脚本。
-exec能够同printf结合起来生成有用的输出信息。例如:
$ find . –name “*.txt” –exec printf “Text file: %s\n” {} \;
find命令在执行搜索时还可以跳过一些子目录,如下示例:
$ find . \( -name “old” –prune \) –o \( -type f –print \)
以上命令打印出不包括在old目录中的所有文件的名称。
使用find命令在系统中查找文件时,有时需要忽略某些目录,可以使用 -prune 参数来进行过滤。 不过必须注意:要忽略的路径参数要紧跟着搜索的路径之后,否则该参数无法起作用。
例如:指定搜索/home/zth目录下的所有文件,但是会忽略/home/zth/astetc的路径:
按照文件名来搜索则为:
要忽略两个以上的路径如何处理?
注意:/( 和/) 前后都有空格。
查找某个文件包含内容,以下语句可以解决目录带空格的问题:
如果目录不带空格,可以这样:
通过以上的例子,大家应该可以掌握find命令查找文件时,忽略相关目录的方法了。
如果想同时删除A和B文件则可以用-o 连接条件 find -name "*" -o -name "A" -o -name "B" -newer A ! -newer B -exec rm -f {} \;