Linux命令find及exec、xargs的使用

由于f i n d具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( N F S ),f i n d命令在该文件系统中同样有效,只要你具有相应的权限。

F i n d命令的一般形式为:
find pathname -options [-print -exec -ok]

该命令的参数:
pathname:  find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print:find命令将匹配的文件输出到标准输出。
-exec:find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为‘ command‘ {} \;,注意{ }和\;之间的空格。
-ok: 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

find命令选项:
-name:按照文件名查找文件。
-perm:按照文件权限来查找文件。
-prune:使用这一选项可以使f i n d命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被f i n d命令忽略。
-user:按照文件属主来查找文件。
-group:按照文件所属的组来查找文件。
-mtime -n +n:按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项。
-nogroup:查找无有效所属组的文件,即该文件所属的组在/ e t c / g r o u p s中不存在。
-nouser:查找无有效属主的文件,即该文件的属主在/ e t c / p a s s w d中不存在。
-newer file1 ! file2:查找更改时间比文件fi l e 1新但比文件f i l e 2旧的文件。
-type 查找某一类型的文件:
     b - 块设备文件。
     d - 目录。
     c - 字符设备文件。
     p - 管道文件。
     l - 符号链接文件。
     f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/ e t c / f s t a b中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统m o u n t点。
-follow:如果f i n d命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用c p i o命令,将这些文件备份到磁带设备中。

1、使用execok来执行shell命令

e x e c选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c选项中。
# find . -type f -exec ls -l {} \;
-rw-r--r--    1 root    root        34928 2003-02-25 ./conf/httpd.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/READM
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec rm{} \;
在下面的例子中, f i n d命令在当前目录中查找所有文件名以. L O G结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
$ find . -name "*.conf" -mtime +5 -ok rm {} \;
< rm ... ./conf/httpd.conf > ? y

2xargs

在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。但有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是x a rg s命令的用处所在,特别是与f i n d命令一起使用。

F i n d命令把匹配到的文件传递给x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用- ex e c选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类文件:
#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
用g r e p命令在当前目录下的所有普通文件中搜索hostnames这个词:
# find . -name "*" -type f-print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames andhave them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

3、下面是find一些常用参数的例子:

1)、使用name选项
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$ H O M E中查找文件名符合* . t x t的文件,使用~作为‘ p a t h na m e参数,波浪号~代表了你的$ H O M E目录。
$ find ~ -name "*.txt" –print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" –print

2)、用perm选项
按照文件权限模式用- pe r m选项。
如在当前目录下查找文件权限位为7 5 5的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 –print
-perm mode:文件许可正好符合mode
-perm +mode:文件许可部分符合mode
-perm -mode: 文件许可完全符合mode
[[email protected] test]# ll
-rwxrwxrwx 1 root root 21 03-21 08:30 file1
-rw-r--r-- 1 root root  0 03-21 07:59 file2
[[email protected] test]# find . -type f -perm-004
./file1
./file2
[[email protected] test]# find . -type f -perm-010
./file1
文件许完全符合mode:
[[email protected] test]# find . -type f -perm-014
./file1
文件许部分符合mode:
[[email protected] test]# find . -type f -perm+014
./file1
./file2

3)、忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用- p r u n e选项来指出需要忽略的目录。在使用- p r u n e选项时要当心,因为如果你同时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。
如果希望在/ a p p s目录下查找文件,但不希望在/ a p p s / b i n目录下查找,可以用:
$ find /apps -path "/apps/bin"-prune -o –print
这个表达式组合特例可以用伪码写为
if -path "/apps/bin " then
         -prune
else
         -print

避开多个文件夹
$find /usr/sam \( -path /usr/sam/dir1 -o-path /usr/sam/file1 \) -prune -o –print
圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
这个表达式组合特例可以用伪码写为
if ( -path /usr/sam/dir1 -o -path/usr/sam/file1 )  then
         -prune
else
         -print

4)、使用user和nouser选项
按文件属主查找文件,如在$ HO M E目录中查找文件属主为sam的文件,可以用:
$ find ~ -user sam –print
为了查找属主帐户已经被删除的文件,可以使用- n o u s e r选项。这样就能够找到那些属主在/ e t c / p a s s w d文件中没有有效帐户的文件。在使用- n o u s e r选项时,不必给出用户名; f i n d命令能够为你完成相应的工作。
例如,希望在/ h o m e目录下查找所有的这类文件,可以用:
$ find /home -nouser –print

5) 、使用group和nogroup选项
就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为了在/ a p p s目录下查找属于gem用户组的文件,可以用:
$ find /apps -group gem –print
要查找没有有效所属用户组的所有文件,可以使用n o g r o u p选项。下面的f i n d命令从文件系统的根目录处查找这样的文件:
$ find / -nogroup-print

6)、按照更改时间或访问时间等查找文件
如果希望按照时间来查找文件,可以使用m t i m e,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用m t i m e选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 –print
find 中的 -ctime -mtime ,-atime 区别?
文件的 Accesstime,atime是文件最后一次被读取的时间。
文件的 Modifiedtime,mtime 是在写入文件时随文件内容的更改而更改的。
文件的 Changetime,ctime 是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改的,即文件状态改变时更改。
Ctime(改变)和mtime(修改)之间的区别在于是更改某个组件的标签还是更改它的内容。如果有人说chmod a-w myfile,那么这是一个改变(ctime会变,mtime不变);如果有人说echo foo >> myfile。则这是一个修改(ctime和mtime都变)。ctime是文件的索引节点发生了改变;mtime是文本本身的内容发生了变化。

7)、查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用- n e w e r选项。它的一般形式为:
newest_file_name ! oldest_file_name

8)、使用type选项
在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d –print

9)、使用size选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。
在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。
在当前目录下查找文件长度大于1 M字节的文件:
$ find . -size +1000000c –print

10)、使用depth选项
在使用f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用d e p t h选项就可以使f i n d命令这样做。这样做的一个原因就是,当在使用f i n d命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为C O N . F IL E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE"-depth -print

11)、使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。
从当前目录开始查找位于本文件系统中文件名以X C结尾的文件:
$ find . -name "*.XC" -mount–print

12)、使用cpio选项
c p i o命令可以用来向磁带设备备份文件或从中恢复文件。可以使用f i n d命令在整个文件系统中(更多的情况下是在部分文件系统中)查找文件,然后用c p i o命令将其备份到磁带上。
如果希望使用c p i o命令备份/ e t c、/ h o m e和/ a p p s目录中的文件,可以使用下面所给出的命令,不过要记住你是在文件系统的根目录下:
#cd /
#find etc home apps -depthe -print |cpio -ivcdC65535 –o
在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/ e t c,那么在恢复时,就只能恢复到/ e t c目录中去,别无其他选择。在上面的例子中,我告诉f i n d命令首先进入/ e t c目录,然后是/ h o m e和/ a p p s目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给c p i o命令进行备份。

时间: 2024-07-30 23:08:07

Linux命令find及exec、xargs的使用的相关文章

linux命令之玩转xargs

linux命令之玩转xargs 我们可以用管道将一个命令的标准输出重定向到另一个命令的标准输出,但是有些命令只能以命令行参数的形式接收数据,而无法接受通过stdin的数据,这个时候我们就要用到xargs. xargs应该紧跟管道操作符之后. 1.将多行转换为单行,将单行转换为多行. [[email protected] 桌面]# cat show.txt wang Hunan Chenzhou 123456 li Guangzhou Zhuhai 654321 [[email protected

Linux命令之 expand split xargs

expand # expand [-t] file 将 [tab] 按键转成空格键 选项与参数: -t     :后面可以接数字.一般来说,一个 tab 按键可以用 8 个空格键取代. [email protected]:~/shell# cat file1 John Dagget 341 King Road Plymouth Alice Ford 22 East Broadway Ricahmond [email protected]:~/shell# expand -t 4 file1 Jo

Linux命令 find 和 exec 联合使用

shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行. 因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了.exec 必须以 \; 结束.exec 后面跟的是二级执行命令. find命令的一个选项,如下所示: (1)在当前目录下(包含子目录),查找所有

Linux命令行批量替换多文件中的字符串【转】

Linux命令行批量替换多文件中的字符串[转自百度文库] 一种是Mahuinan法,一种是Sumly法,一种是30T法分别如下: 一.Mahuinan法: 用sed命令可以批量替换多个文件中的字符串.sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` 例如:我要把mahuinan替换为huinanma, 执行命令:sed -i "s/mahuinan/huinanma/g" 'grep mahuinan -rl /www' 这是目

linux 命令整理(自己常用)

Linux 常用命令 1. Linux下有两种用户:超级用户(root).普通用户. a) 超级用户:可以再linux系统下做任何事情,不受限制. b) 普通用户:在linux下做有限的事情. 超级用户的命令提示符是"#",普通用户的命令提示符是"$". 命令:su  [用户名] 功能:切换用户. 例如,要从root用户切换到普通用户user,则使用 su user. 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输

find命令处理之exec与xargs区别

对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令.{}表示命令的参数即为所找到的文件,以:表示comman命令的结束.\是转义符,因为分号在命令中还有它用途,所以就用一个\来限定表示这是一个分号而不是表示其它意思. -ok: 和-exec的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数所给出的shell给出的这个命令之前,都会给出提示,让用户来确定是否执行. xargs 要结合管道来完成 格式:find [option] express |xargs co

每天一个 Linux 命令(20):find命令之exec

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠. {}   花括号代表前面find查找出来的文件名. 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的.在有些操作系统中只允许-ex

每日linux命令学习-xargs命令

xargs命令 xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令.      简单来说,通常与“|”搭配

每天一个linux命令(20):find命令之exec

find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠. {}   花括号代表前面find查找出来的文件名. 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的.在有些操作系统中只允许-ex