linuxfind命令参数及⽤法详解--linux查⽂件命令
根据下列规则判断 path 和 ession,在列上第⼀个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使⽤⽬前路径,如果 expression 是空字串则使⽤ -print 为预设 expression。
由于find具有强⼤的功能,所以它的选项也很多,其中⼤部分选项都值得我们花时间来了解⼀下。即使系统中含有⽹络⽂件系统( NFS),find 命令在该⽂件系统中同样有效,只你具有相应的权限。
在运⾏⼀个⾮常消耗资源的find命令时,很多⼈都倾向于把它放在后台执⾏,因为遍历⼀个⼤的⽂件系统可能会花费很长的时间(这⾥是指30G字节以上的⽂件系统)。
⼀、find 命令格式
1、find命令的⼀般形式为;
find pathname -options [-print -exec -ok ...]
2、find命令的参数;
pathname: find命令所查的⽬录路径。例如⽤.来表⽰当前⽬录,⽤/来表⽰系统根⽬录。-print: find命
令将匹配的⽂件输出到标准输出。-exec: find命令对匹配的⽂件执⾏该参数所给出的shell命令。相应命令的形式为\'command\' { } ;,注意{ }和;之间的空格。-ok:和-exec的作⽤相同,只不过以⼀种更为安全的模式来执⾏该参数所给出的shell命令,在执⾏每⼀个命令之前,都会给出提⽰,让⽤户来确定是否执⾏。
3、find命令选项
-name
按照⽂件名查⽂件。
-pe
按照⽂件权限来查⽂件。-prune使⽤这⼀选项可以使find命令不在当前指定的⽬录中查,如果同时使⽤-depth选项,那么-prune将被find 命令忽略。-user按照⽂件属主来查⽂件。-group按照⽂件所属的组来查⽂件。-m-n +n按照⽂件的更改时间来查⽂件, - n表⽰⽂件更改时间距现在n天以内,+ n表⽰⽂件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。-nogroup查⽆有效所属组的⽂件,即该⽂件所属的组在/etc/groups中不存在。-nouser查⽆有效属主的⽂件,即该⽂件的属主在/etc/中不存在。-newer 1 ! file2 查更改时间⽐⽂件file1新但⽐⽂件file2
旧的⽂件。-type 查某⼀类型的⽂件,诸如:b - 块设备⽂件。d - ⽬录。c - 字符设备⽂件。p - 管道⽂件。l - 符号链接⽂件。f - 普通⽂件。-size n:[c] 查⽂件长度为n块的⽂件,带有c时表⽰⽂件长度以字节计。-depth:在查⽂件时,⾸先查当前⽬录中的⽂件,然后再在其⼦⽬录中查。-fstype:查位于某⼀类型⽂件系统中的⽂件,这些⽂件系统类型通常可以在配置⽂件/etc/fstab中到,该配置⽂件中包含了本系统中有关⽂件系统的信息。-mount:在查⽂件时不跨越⽂件系统mount 点。-follow:如果find命令遇到符号链接⽂件,就跟踪⾄链接所指向的⽂件。-io:对匹配的⽂件使⽤命令,将这些⽂件备份到磁带设备中。
另外,下⾯三个的区别:
-amin n
查系统中最后N分钟访问的⽂件
-atime n
查系统中最后n*24⼩时访问的⽂件
-cmin n
查系统中最后N分钟被改变⽂件状态的⽂件
-ctime n
查系统中最后n*24⼩时被改变⽂件状态的⽂件
-mmin n
查系统中最后N分钟被改变⽂件数据的⽂件
-mtime n
查系统中最后n*24⼩时被改变⽂件数据的⽂件
4、使⽤exec或ok来执⾏shell命令
使⽤find时,只要把想要的操作写在⼀个⽂件⾥,就可以⽤exec来配合find查,很⽅便的
在有些操作系统中只允许-exec选项执⾏诸如l s或-l这样的命令。⼤多数⽤户使⽤这⼀选项是为了查旧⽂件并删除它们。建议在真正执⾏rm 命令删除⽂件之前,最好先⽤ls命令看⼀下,确认它们是所要删除的⽂件。
exec选项后⾯跟随着所要执⾏的命令或脚本,然后是⼀对⼉{ },⼀个空格和⼀个,最后是⼀个分号。
为了使⽤exec选项,必须要同时使⽤print选项。如果验证⼀下find命令,会发现该命令只输出从当前路径起的相对路径及⽂件名。
例如:为了⽤ls -l命令列出所匹配到的⽂件,可以把ls -l命令放在find命令的-exec选项中
# find . -type f -exec ls -l { } ;-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/.conf-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
上⾯的例⼦中,find命令匹配到了当前⽬录下的所有普通⽂件,并在-exec选项中使⽤ls -l命令将它们列出。在/logs⽬录中查更改时间在5⽇以前的⽂件并删除它们:
$ find logs -type f -mtime +5 -exec rm { } ;
记住:在shell中⽤任何⽅式删除⽂件之前,应当先查看相应的⽂件,⼀定要⼩⼼!当使⽤诸如或rm命令时,可以使⽤-exec选项的安全模式。它将在对每个匹配到的⽂件进⾏操作之前提⽰你。
在下⾯的例⼦中, find命令在当前⽬录中查所有⽂件名以.LOG结尾、更改时间在5⽇以上的⽂件,并删除它们,只不过在删除之前先给出提⽰。
$ find . -name *.conf -mtime +5 -ok rm { } ;< rm ... ./f > ? n
按y键删除⽂件,按n键不删除。
任何形式的命令都可以在-exec选项中使⽤。
在下⾯的例⼦中我们使⽤命令。find命令⾸先匹配所有⽂件名为“ passwd*”的⽂件,例如passwd、passwd.old、passwd.bak,然后执⾏grep 命令看看在这些⽂件中是否存在⼀个sam⽤户。
# find /etc -name passwd* -exec grep sam { } ;
sam:x:501:501::/usr/sam:/bin/bash
⼆、find命令的例⼦;
1、查当前⽤户主⽬录下的所有⽂件:
下⾯两种⽅法都可以使⽤
$ find $HOME -print
$ find ~ -print
2、让当前⽬录中⽂件属主具有读、写权限,并且⽂件所属组的⽤户和其他⽤户具有读权限的⽂件;
$ find . -type f -perm 644 -exec ls -l { } ;
3、为了查系统中所有⽂件长度为0的普通⽂件,并列出它们的完整路径;
$ find / -type f -size 0 -exec ls -l { } ;
4、查/var/logs⽬录中更改时间在7⽇以前的普通⽂件,并在删除之前询问它们;
$ find /var/logs -type f -mtime +7 -ok rm { } ;
5、为了查系统中所有属于root组的⽂件;
$find . -group root -exec ls -l { } ;-rw-r--r-- 1 root root 595 10⽉ 31 01:09 ./fie1
6、find命令将删除当⽬录中访问时间在7⽇以来、含有数字后缀的admin.log⽂件。
该命令只检查三位数字,所以相应⽂件的后缀不要超过999。先建⼏个admin.log*的⽂件,才能使⽤下⾯这个命令
$ find . -name admin.log[0-9][0-9][0-9] -atime -7 -okrm { } ;< rm ... ./admin.log001 > ? n< rm ... ./admin.log002 > ? n< rm ... ./admin.log042 > ? n< rm ... ./admin.log942 > ? n
7、为了查当前⽂件系统中的所有⽬录并排序;
$ find . -type d |
8、为了查系统中所有的rmt磁带设备;
$ find /dev/rmt -print
三、xargs
xargs - build and exee command lines from standard input
在使⽤find命令的-exec选项处理匹配到的⽂件时, find命令将所有匹配到的⽂件⼀起传递给exec执⾏。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运⾏⼏分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的⽤处所在,特别是与find命令⼀起使⽤。
find命令把匹配到的⽂件传递给xargs命令,⽽xargs命令每次只获取⼀部分⽂件⽽不是全部,不像-exec选项那样。这样它可以先处理最先获取的⼀部分⽂件,然后是下⼀批,并如此继续下去。
在有些系统中,使⽤-exec选项会为处理每⼀个匹配到的⽂件⽽发起⼀个相应的进程,并⾮将匹配到的⽂件全部作为参数⼀次执⾏;这样在有些情况下就会出现进程过多,系统性能下降的问题,因⽽效率不⾼;
⽽使⽤xargs命令则只有⼀个进程。另外,在使⽤xargs命令时,究竟是⼀次获取所有的参数,还是分批取得参数,以及每⼀次获取参数的数
⽬都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令⼀起使⽤的,并给出⼀些例⼦。
下⾯的例⼦查系统中的每⼀个普通⽂件,然后使⽤xargs命令来测试它们分别属于哪类⽂件
#find . -type f -print | xargs file./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text./.kde/Autostart/.directory:
在整个系统中查内存信息转储⽂件(core mp) ,然后把结果保存到/tmp/core.log ⽂件中:
$ find / -name core -print | xargs echo >/tmp/core.log
上⾯这个执⾏太慢,我改成在当前⽬录下查
#find . -name file* -print | xargs echo > /temp/core.log# /temp/core.log./file6
在当前⽬录下查所有⽤户具有读、写和执⾏权限的⽂件,并收回相应的写权限:
# ls -l
drwxrwxrwx 2 sam adm 4096 10⽉ 30 20:14 file6
-rwxrwxrwx 2 sam adm 0 10⽉ 31 01:f
-rwxrwxrwx 2 sam adm 0 10⽉ 31 01:f
# find . -perm -7 -print | xargs o-w# ls -ldrwxrwxr-x 2 sam adm 4096 10⽉ 30 20:14 file6-rwxrwxr-x 2 sam adm 0 10⽉ 31 01:f-rwxrwxr-x 2 sam adm 0 10⽉ 31 01:f
⽤grep命令在所有的普通⽂件中搜索hostname这个词:
# find . -type f -print | xargs grep hostname./f:# erent IP aresses or hostnames and have them handled by the./f:# VirtualHost: If you want to maintain multiple domains/hostnameson your
⽤grep命令在当前⽬录下的所有普通⽂件中搜索hostnames这个词:
# find . -name * -type f -print | xargs grep hostnames./f:# different IP addresses or hostnames and have them handled by
the./f:# VirtualHost: If you want to maintain multiple domains/hostnameson your
find查命令的使用注意,在上⾯的例⼦中,⽤来取消find命令中的*在shell中的特殊含义。
find命令配合使⽤exec和xargs可以使⽤户对所匹配到的⽂件执⾏⼏乎所有的命令。
四、find 命令的参数
下⾯是find⼀些常⽤参数的例⼦,有⽤到的时候查查就⾏了,像上⾯前⼏个贴⼦,都⽤到了其中的的⼀些参数,也可以⽤man或查看⾥其它贴⼦有find的命令⼿册
1、使⽤name选项
⽂件名选项是find命令最常⽤的选项,要么单独使⽤该选项,要么和其他选项⼀起使⽤。
可以使⽤某种⽂件名模式来匹配⽂件,记住要⽤引号将⽂件名模式引起来。
不管当前路径是什么,如果想要在⾃⼰的根⽬录$HOME中查⽂件名符合*.txt的⽂件,使⽤~作为 \'pathname\'参数,波浪号~代表了你的$HOME⽬录。
$ find ~ -name *.txt -print
想要在当前⽬录及⼦⽬录中查所有的‘ *.txt’⽂件,可以⽤:
$ find . -name *.txt -print
想要的当前⽬录及⼦⽬录中查⽂件名以⼀个⼤写字母开头的⽂件,可以⽤:
页 2
想要在/etc⽬录中查⽂件名以host开头的⽂件,可以⽤:
$ find /etc -name host* -print
想要查$HOME⽬录中的⽂件,可以⽤:
$ find ~ -name * -print 或find . -print
要想让系统⾼负荷运⾏,就从根⽬录开始查所有的⽂件。
如果想在当前⽬录查⽂件名以两个⼩写字母开头,跟着是两个数字,最后是.txt的⽂件,下⾯的命令就能够返回名为的⽂件:
$find . -name [a-z][a-z][0--9][0--9].txt -print
2、⽤perm选项
按照⽂件权限模式⽤-perm选项,按⽂件权限模式来查⽂件的话。最好使⽤⼋进制的权限表⽰法。
如在当前⽬录下查⽂件权限位为755的⽂件,即⽂件属主可以读、写、执⾏,其他⽤户可以读、执⾏的⽂件,可以⽤:
$ find . -perm 755 -print
还有⼀种表达⽅法:在⼋进制数字前⾯要加⼀个横杠-,表⽰都匹配,如-007就相当于777,-006相当于666
# ls -l
-rwxrwxr-x 2 sam adm 0 10⽉ 31 01:f
-
rw-rw-rw- 1 sam adm 34890 10⽉ 31 00:f
-rwxrwxr-x 2 sam adm 0 10⽉ 31 01:f
drw-rw-rw- 2 gem group 4096 10⽉ 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10⽉ 31 20:19 temp
# find . -perm 006# find . -perm -006./sam./f./temp
-perm mode:⽂件许可正好符合mode
-perm +mode:⽂件许可部分符合mode
-perm -mode: ⽂件许可完全符合mode
3、忽略某个⽬录
如果在查⽂件时希望忽略某个⽬录,因为你知道那个⽬录中没有你所要查的⽂件,那么可以使⽤-prune选项来指出需要忽略的⽬录。在使⽤-prune选项时要当⼼,因为如果你同时使⽤了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps⽬录下查⽂件,但不希望在/apps/bin⽬录下查,可以⽤:
$ find /apps -path /apps/bin -prune -o -print
4、使⽤find查⽂件的时候怎么避开某个⽂件⽬录
⽐如要在/usr/sam⽬录下查不在dir1⼦⽬录之内的所有⽂件
find /usr/sam -path /usr/sam/dir1 -prune -o -print
find [-path ..] [expression] 在路径列表的后⾯的是表达式
-path /usr/sam -prune -o -print 是 -path /usr/sam -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path /usr/sam 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path /usr/sam -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以⽤伪码写为
if -path /usr/sam then
-prune
else
-print
避开多个⽂件夹
find /usr/sam ( -path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -print
圆括号表⽰表达式的结合。
表⽰引⽤,即指⽰ shell 不对后⾯的字符作特殊解释,⽽留给 find 命令去解释其意义。
查某⼀确定⽂件,-name等选项加在-o 之后
#find /usr/sam (-path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -name temp -print
5、使⽤user和nouser选项
按⽂件属主查⽂件,如在$HOME⽬录中查⽂件属主为sam的⽂件,可以⽤:
在/etc⽬录下查⽂件属主为的⽂件:
$ find /etc -user uucp -print
为了查属主帐户已经被删除的⽂件,可以使⽤-nouser选项。这样就能够到那些属主在/etc/passwd⽂件中没有有效帐户的⽂件。在使⽤-nouser选项时,不必给出⽤户名; find命令能够为你完成相应的⼯作。
例如,希望在/home⽬录下查所有的这类⽂件,可以⽤:
$ find /home -nouser -print
6、使⽤group和nogroup选项
就像user和nouser选项⼀样,针对⽂件所属于的⽤户组, find命令也具有同样的选项,为了在/apps⽬录下查属于gem⽤户组的⽂件,可以⽤:
$ find /apps -group gem -print
要查没有有效所属⽤户组的所有⽂件,可以使⽤nogroup选项。下⾯的find命令从⽂件系统的根⽬录处查这样的⽂件
$ find / -nogroup-print
7、按照更改时间或访问时间等查⽂件
如果希望按照更改时间来查⽂件,可以使⽤mtime,atime或ctime选项。如果系统突然没有可⽤空间了,很有可能某⼀个⽂件的长度在此期间增长迅速,这时就可以⽤mtime选项来查这样的⽂件。
⽤减号-来限定更改时间在距今n⽇以内的⽂件,⽽⽤加号+来限定更改时间在距今n⽇以前的⽂件。
希望在系统根⽬录下查更改时间在5⽇以内的⽂件,可以⽤:
$ find / -mtime -5 -print
为了在/var/adm⽬录下查更改时间在3⽇以前的⽂件,可以⽤:
$ find /var/adm -mtime +3 -print
8、查⽐某个⽂件新或旧的⽂件
如果希望查更改时间⽐某个⽂件新但⽐另⼀个⽂件旧的所有⽂件,可以使⽤-newer选项。它的⼀般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑⾮符号。
查更改时间⽐⽂件sam新但⽐⽂件temp旧的⽂件:
例:有两个⽂件
-rw-r--r-- 1 sam adm 0 10⽉ 31 01:07 fiel
-rw-rw-rw- 1 sam adm 34890 10⽉ 31 00:f
-rwxrwxr-x 2 sam adm 0 10⽉ 31 01:f
drw-rw-rw- 2 gem group 4096 10⽉ 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10⽉ 31 20:19 temp
# find -f ! -newer temp -ls1077669 0 -rwxrwxr-x 2 sam adm 0 10⽉ 31 01:01 ./f1077671 4 -rw-rw-rw- 1 root root 2792 10⽉ 31 20:19 ./temp1077673 0 -rw-r--r-- 1 sam adm 0 10⽉ 31 01:07 ./fiel
查更改时间在⽐temp⽂件新的⽂件:
$ find . -newer temp -print
9、使⽤type选项
在/etc⽬录下查所有的⽬录,可以⽤:
$ find /etc -type d -print
在当前⽬录下查除⽬录以外的所有类型的⽂件,可以⽤:
$ find . ! -type d -print
在/etc⽬录下查所有的符号链接⽂件,可以⽤
$ find /etc -type l -print
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论