find and xargs 运用详解ITeye - 威尼斯人

find and xargs 运用详解ITeye

2019-01-10 23:15:41 | 作者: 念波 | 标签: 运用,文件,指令 | 浏览: 2927

运用find和xargs
有时或许需求在体系中查找具有某一特征的文件(例如文件权限、文件属主、文件长度、
文件类型等等)。这样做或许有许多原因。或许出于安全性的考虑,或是一般性的体系管理任
务,或许仅仅为了找出一个不知保存在什么地方的文件。F i n d是一个十分有用的东西,它可
以遍历当时目录甚至于整个文件体系来查找某些文件或目录。
在本章中,咱们介绍以下内容:
* find指令选项。
* 运用f i n d指令不同选项的比如。
* 合作f i n d运用x a rg s指令的比如。
由于f i n d具有如此强壮的功用,所以它的选项也许多,其间大部分选项都值得咱们花时刻
来了解一下。即便体系中含有网络文件体系( N F S ),f i n d指令在该文件体系中相同有用,只需
你具有相应的权限。
在运转一个十分耗费资源的f i n d指令时,许多人都倾向于把它放在后台履行,由于遍历一
个大的文件体系或许会花费很长的时刻(这儿是指3 0 G字节以上的文件体系)。
F i n d指令的一般办法为:
find pathname -options [-print -exec -ok]
让咱们来看看该指令的参数:
pathname find指令所查找的目录途径。例如用.来表明当时目录,用/来表明体系根目录。
-print find指令将匹配的文件输出到规范输出。
-exec find指令对匹配的文件履行该参数所给出的s h e l l指令。相应指令的办法为 c o m m -
and {} \;,留意{ }和\;之间的空格。
-ok 和- e x e c的效果相同,只不过以一种更为安全的办法来履行该参数所给出的s h e l l指令,
在履行每一个指令之前,都会给出提示,让用户来断定是否履行。
find指令选项
f i n d指令有许多选项或表达式,每一个选项前面跟从一个横杠-。让咱们先来看一下该命
令的首要选项,然后再给出一些比如。
-name 依照文件名查找文件。
-perm 依照文件权限来查找文件。
-prune 运用这一选项能够使f i n d指令不在当时指定的目录中查找,假如一同运用了- d e p t h
选项,那么- p r u n e选项将被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选项
类似,所以咱们在这儿只介绍- 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 查找更改时刻比文件f i 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指令,将这些文件备份到磁带设备中。
运用name选项
文件名选项是f i n d指令最常用的选项,要么独自运用该选项,要么和其他选项一同运用。
能够运用某种文件名办法来匹配文件,记住要用引号将文件名办法引起来。
不论当时途径是什么,假如想要在自己的根目录$ H O M E中查找文件名契合* . t x t的文件,
运用~作为 p a t h n a m e参数,波涛号~代表了你的$ H O M E目录。
$ find ~ -name "*.txt" -print
想要在当时目录及子目录中查找一切的 * . t x t文件,能够用:
$ find . -name "*.txt" -print
想要的当时目录及子目录中查找文件名以一个大写字母最初的文件,能够用:
$ find . -name "[A-Z]*" -print
想要在/ e t c目录中查找文件名以h o s t最初的文件,能够用:
$ find /etc -name "host*" -print
想要查找$ H O M E目录中的文件,能够用:
$ find ~ -name "*" -print 或find . -print
要想让体系高负荷运转,就从根目录开端查找一切的文件。假如期望在体系管理员那里
保存一个好形象的话,最好在这么做之前考虑清楚!
$ find / -name "*" -print
假如想在当时目录查找文件名以两个小写字母最初,跟着是两个数字,最终是* . t x t的文
件,下面的指令就能够回来名为a x 3 7 . t x t的文件:

$ find . -name "[a-z][a-z][0--9][0--9].txt" -print
运用perm选项
假如期望依照文件权限办法来查找文件的话,能够选用- p e r m选项。你或许需求找到一切
用户都具有履行权限的文件,或是期望查看某个用户目录下的文件权限类型。在运用这一选
项的时分,最好运用八进制的权限表明法。
为了在当时目录下查找文件权限位为7 5 5的文件,即文件属主能够读、写、履行,其他用
户能够读、履行的文件,能够用:
$ find . -perm 755 -print
假如期望在当时目录下查找一切用户都可读、写、履行的文件(要留神这种状况),咱们
能够运用f i n d指令的- p e r m选项。在八进制数字前面要加一个横杠-。鄙人面的指令中- p e r m代
表依照文件权限查找,而 0 0 7和你在c h m o d指令的肯定办法中所选用的表明法完全相同。
$ find . -perm -007 -print
疏忽某个目录
假如在查找文件时期望疏忽某个目录,由于你知道那个目录中没有你所要查找的文件,
那么能够运用- 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 -name "/apps/bin" -prune -o -print
2.1.4 运用user和nouser选项
假如期望依照文件属主查找文件,能够给出相应的用户名。例如,在$ H O M E目录中查找
文件属主为d a v e的文件,能够用:
$ find ~ -user dave -print
在/ e t c目录下查找文件属主为u u c p的文件:
$ find /etc -user uucp -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
运用group和nogroup选项
就像u s e r和n o u s e r选项相同,针对文件所归于的用户组, f i n d指令也具有相同的选项,为
了在/ a p p s目录下查找归于a c c t s用户组的文件,能够用:
$ find /apps -group accts -print
要查找没有有用所属用户组的一切文件,能够运用n o g r o u p选项。下面的f i n d指令从文件
体系的根目录处查找这样的文件
$ fine/-nogroup-print
依照更改时刻查找文件
假如期望依照更改时刻来查找文件,能够运用m t i m e选项。假如体系俄然没有可用空间了,
很有或许某一个文件的长度在此期间增加敏捷,这时就能够用m t i m e选项来查找这样的文件。
用减号-来约束更改时刻在距今n日以内的文件,而用加号+来约束更改时刻在距今n日曾经的
文件。
期望在体系根目录下查找更改时刻在5日以内的文件,能够用:
$ find / -mtime -5 -print
为了在/ v a r / a d m目录下查找更改时刻在3日曾经的文件,能够用:
$ find /var/adm -mtime +3 -print
查找比某个文件新或旧的文件
假如期望查找更改时刻比某个文件新但比另一个文件旧的一切文件,能够运用- n e w e r选
项。它的一般办法为:
newest_file_name ! oldest_file_name
其间,!是逻辑非符号。
这儿有两个文件,它们的更改时刻大约相差两天。
下面给出的f i n d指令能够查找更改时刻比文件a g e . a w k新但比文件b e l t s . a w k旧的文件:
假如想运用f i n d指令的这一选项来查找更改时刻在两个小时以内的文件,除非有一个现成
的文件其更改时刻刚好在两个小时曾经,不然就没有可用来比较更改时刻的文件。为了处理
这一问题,能够首要创立一个文件并将其日期和时刻戳设置为所需求的时刻。这能够用t o u c h
指令来完成。
假定现在的时刻是2 3 : 4 0,期望查找更改时刻在两个小时以内的文件,能够首要创立这样
一个文件:
一个契合要求的文件现已被创立;这儿咱们假定今天是五月四日,而该文件的更改时刻
是2 1 : 4 0,比现在刚好早两个小时。
现在咱们就能够运用f i n d指令的- n e w e r选项在当时目录下查找一切更改时刻在两个小时以
内的文件:
$ find . -newer dstamp -print
运用type选项
U N I X或L I N U X体系中有若干种不同的文件类型,这部分内容咱们在前面的章节现已做了

介绍,这儿就不再赘述。假如要在/ e t c目录下查找一切的目录,能够用:
$ find /etc -type d -print
为了在当时目录下查找除目录以外的一切类型的文件,能够用:
$ find . ! -type d -print
为了在/ e t c目录下查找一切的符号链接文件,能够用:
$ find /etc -type l -print
2.1.9 运用size选项
能够依照文件长度来查找文件,这儿所指的文件长度既能够用块( b l o c k)来计量,也可
以用字节来计量。以字节计量文件长度的表达办法为N c;以块计量文件长度只用数字表明即
可。
就我个人而言,我总是运用以字节计的办法,在依照文件长度查找文件时,大多数人都
喜爱运用这种以字节表明的文件长度,而不必块的数目来表明,除非是在查看文件体系的大
小,由于这时运用块来计量更简单转化。
为了在当时目录下查找文件长度大于1 M字节的文件,能够用:
$ find . -size +1000000c -print
为了在/ h o m e / a p a c h e目录下查找文件长度刚好为1 0 0字节的文件,能够用:
$ find /home/apache -size 100c -print
为了在当时目录下查找长度超越1 0块的文件(一块等于5 1 2字节),能够用:
$ find . -size +10 -print
运用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 I L E的文件。
它将首要匹配一切的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print
运用mount选项
在当时的文件体系中查找文件(不进入其他文件体系),能够运用f i n d指令的m o u n t选项。
鄙人面的比如中,咱们从当时目录开端查找坐落本文件体系中文件名以X C完毕的文件:
$ find . -name "*.XC" -mount -print
运用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目录中的文件,能够运用下面所给出的命
令,不过要记住你是在文件体系的根目录下:

(在上面的比如中,榜首行结束的\通知s h e l l指令还未完毕,疏忽\后边的回车。)
在上面的比如中,应当留意到途径中短少/。这叫作相对途径。之所以运用相对途径,是
由于在从磁带中康复这些文件的时分,能够挑选康复文件的途径。例如,能够将这些文件先
康复到别的一个目录中,对它们进行某些操作后,再康复到原始目录中。假如在备份时运用
了肯定途径,例如/ 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指令进行备份。
趁便说一下,在上面的比如中c p i o指令运用了C 6 5 5 3 6选项,我本能够运用B选项,不过这
样每块的巨细只要5 1 2 字节,而运用了C 6 5 5 3 6 选项后,块的巨细变成了6 4 K 字节
(6 5 5 3 6 / 1 0 2 4)。
运用exec或ok来履行shell指令
当匹配到一些文件今后,或许期望对其进行某些操作,这时就能够运用- e x e c选项。一旦
f i n d指令匹配到了相应的文件,就能够用- e x e c选项中的指令对其进行操作(在有些操作体系
中只允许- e x e c选项履行比如l s或ls -l这样的指令)。大多数用户运用这一选项是为了查找旧文
件并删去它们。这儿我激烈地主张你在真实履行r m指令删去文件之前,最好先用l s指令看一
下,承认它们是所要删去的文件。
e x e c选项后边跟从着所要履行的指令,然后是一对儿{ },一个空格和一个\,最终是一个
分号。
为了运用e x e c选项,有必要要一同运用p r i n t选项。假如验证一下f i n d指令,会发现该指令只
输出从当时途径起的相对途径及文件名。
为了用ls -l指令列出所匹配到的文件,能够把ls -l指令放在f i n d指令的- e x e c选项中,例如:
上面的比如中,f i n d指令匹配到了当时目录下的一切一般文件,并在- e x e c选项中运用ls -l
指令将它们列出。
为了在/ l o g s目录中查找更改时刻在5日曾经的文件并删去它们,能够用:
$ find logs -type f -mtime +5 -exec rm {} \;
记住,在s h e l l顶用任何办法删去文件之前,应当先查看相应的文件,一定要留神!
当运用比如m v或r m指令时,能够运用- e x e c选项的安全办法。它将在对每个匹配到的文件
进行操作之前提示你。鄙人面的比如中, f i n d指令在当时目录中查找一切文件名以. L O G完毕、
更改时刻在5日以上的文件,并删去它们,只不过在删去之前先给出提示。
按y键删去文件,按n键不删去。
任何办法的指令都能够在- e x e c选项中运用。鄙人面的比如中咱们运用g r e p指令。f i n d指令

首要匹配一切文件名为" p a s s w d *"的文件,例如p a s s w d、p a s s w d . o l d、p a s s w d . b a k,然后执
行g r e p指令看看在这些文件中是否存在一个r o u n d e r用户。
find指令的比如
咱们现已介绍了f i n d指令的根本选项,下面给出f i n d指令的一些其他的比如。
为了匹配$ H O M E目录下的一切文件,下面两种办法都能够运用:
$ find $HOME -print
$ find ~ -print
为了在当时目录中查找s u i d置位,文件属主具有读、写、履行权限,而且文件所属组的用
户和其他用户具有读和履行的权限的文件,能够用:
$ find . -type f -perm 4755 -print
为了查找体系中一切文件长度为0的一般文件,并列出它们的完好途径,能够用:
$ find / -type f -size 0 -exec ls -l {} \;
为了查找/ v a r / l o g s目录中更改时刻在7日曾经的一般文件,并删去它们,能够用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;
为了查找体系中一切归于a u d i t组的文件,能够用:
$find /-name -group audit -print
咱们的一个审计体系每天创立一个审计日志文件。日志文件名的最终含有数字,这样我
们一眼就能够看出哪个文件是最新的,哪个是最旧的。A d m i n . l o g 文件编上了序号:
a d m i n . l o g . 0 0 1、a d m i n . l o g . 0 0 2等等。下面的f i n d指令将删去/ l o g s目录中拜访时刻在7日曾经、
含有数字后缀的a d m i n . l o g文件。该指令只查看三位数字,所以相应日志文件的后缀不要超越
9 9 9。
$ find /logs -name admin.log[0-9][0-9][0-9] -atime +7 -exec rm {} \;
为了查找当时文件体系中的一切目录并排序,能够用:
$ find . -type d -print -local -mount |sort
为了查找体系中一切的r m t磁带设备,能够用:
$ find /dev/rmt -print
xargs
在运用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选项那样。这样它能够先处理
最早获取的一部分文件,然后是下一批,并如此继续下去。在有些体系中,运用- e x e c选项会
为处理每一个匹配到的文件而建议一个相应的进程,并非将匹配到的文件悉数作为参数一次
履行;这样在有些状况下就会呈现进程过多,体系功能下降的问题,因此功率不高;而运用

x a rg s指令则只要一个进程。别的,在运用x a rg s指令时,究竟是一次获取一切的参数,仍是分
批获得参数,以及每一次获取参数的数目都会依据该指令的选项及体系内核中相应的可调参
数来断定。
让咱们来看看x a rg s指令是怎么同f i n d指令一同运用的,并给出一些比如。
下面的比如查找体系中的每一个一般文件,然后运用x a rg s指令来测验它们别离归于哪类
文件:
下面的比如在整个体系中查找内存信息转储文件(core dump) ,然后把成果保存到
/tmp/core.log 文件中:
$ find . -name "core" -print | xargs echo "" /tmp/core.log
下面的比如在/ a p p s / a u d i t目录下查找一切用户具有读、写和履行权限的文件,并回收相应
的写权限:
$ find /apps/audit -perm -7 -print | xargs chmod o-w
鄙人面的比如中,咱们用g r e p指令在一切的一般文件中查找d e v i c e这个词:
$ find / -type f -print | xargs grep "device"
鄙人面的比如中,咱们用g r e p指令在当时目录下的一切一般文件中查找D B O这个词:
$ find . -name \ *-type f -print | xargs grep "DBO"
留意,在上面的比如中, \用来撤销f i n d指令中的*在s h e l l中的特别意义。
小结
f i n d指令是一个十分优异的东西,它能够依照用户指定的原则来匹配文件。运用e x e c和
x a rg s能够运用户对所匹配到的文件履行简直一切的指令。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章