Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

时间:2022-01-21 06:44:48

1.使用find可以查找出符合某一特性(如权限、属主、长度、类型、名字等)的文件或目录,结合-exec、-ok和-xargs,可以完成更多的工作。

2.find的name选项:

根据文件名字匹配查找,如在自己的根目录下查找符合*.txt的文件:

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

扩展:find/!-name"myshell"-print

(

从上面的输出可以看出,对于root用户而言:

~

$home

/root

代表的都是同一个目录,就是/root。

特别的,对于用户xxx而言,$home和~代表的就是/xxx目录,这个目录的位置(以zhy用户为例),如下:

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

可以看到,/zhy是在/home下。对于非管理员用户,/xxx目录都是在/home下,而root用户的/root目录位置如下:

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

是直接位于根目录下的(管理员是老大嘛,当然优待咯)。

)

在当前目录下查找,就用“.“:

#find.-name"*.txt"-print

该命令会查找当前目录及子目录下满足条件的文件。

在当前目录中查找大写字母开头的文件:

#find.-name"[a-z]*"-print

注意后面有个*

在/etc中查找以"host"开头的文件:

#find/etc-name"host*"-print

在$home下查找所有文件:

#find~-name"*"-print

#find~-print

如果想让系统高负荷运转,就用从根目录查找:

#find/-name"*"-print(#find/-print)

对这个命令稍加修改:

#find/-name"*"-print&

就可以让它在后台运行了,这个时候,通过ctrl+c,也不能中断它的执行了。。。

查找文件以两个小写字母开头,跟着是两个数字的.txt文件,可以用:

#find/-name"[a-z][a-z][0-9][0-9].txt"-print

3.find的perm选项:

按照文件权限来查找文件。

查找文件属主可以读、写、执行,其他用户可以读、执行的文件:

#find.-perm755-print

如:

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

扩展:find.!-perm755-print

4.find的prune选项:

查找文件时,忽略某个目录,如:

如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:

#find/apps-name"/apps/bin"-prune-o-print

5.user和nouser选项:

user:根据文件的属主查找文件:

#find.-userzhy-print

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

在linux下,可能有些属主,可能被管理员删掉了,这个时候,就能用-nouser选项找到那些在属主在/etc/passwd文件中没有有效账户的文件。在用-nouser时,不用给出用户名。

#find/-nouser-print

6.使用group和nogroup:

就像使用user和nouser一样,group与nogroup选项能找出属于某一用户组的文件,和用户组已经不存在的文件。

#find/-groupzhy-print

#find/-nogroup-print

7.使用-mtime选项:

该选项可以查找指定时间内或指定时间外修改的文件,如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件:

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

-1表示1日(24小时)之内更改过的文件。

+2表示2日(48小时)之前更改过的文件。

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

8.newer选项:

newer命令能让我们找出更改时间介于两个文件之间的文件,如有下面两个文件,它们更改时间相差大概两天:

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

通过下面的命令,我们就可以找出更改时间介于这两者的文件了:

#find/-newerage.awk!-newerbelts.awk-execls-l{}\;

从上面可以看出,这种比较必须有参考的文件,比如要查找更改时间在两个小时以内的文件,就必须有一个更改时间正好在两个小时之前那个时刻的文件可以供参考。这里我们可以通过touch来创建一个指定更改时间的文件:

假如现在是12月26日10点41分,那就需要创建一个更改时间在12月26日08点41分的文件:

#touch-t12260841oldfile

然后通过:

#find/-neweroldfile-print

来查找更改时间在两个小时内的文件。

9.用type查找指定类型的文件:

在根目录下,查找所有的目录:

#find/-typed-print

查找除目录以外所有类型的文件:

#find/!-typed-print

查找所有符号链接文件:

#find/-typel-print

查找所有普通文件:

#find/-typef-print

10.使用size选项:

使用可以查找指定长度的文件,可以以字节为单位,也可以用块为单位,1块=512字节(0.5m)。

以字节为单位,需要在数字后面加c,如:

在根目录下查找文件长度大于1m的文件:

#find/-size+1000000c-print

用块表示就是:

#find/-size+2-print

查找刚好是100字节的文件:

#find/-size100c-print

查找小于100字节的文件:

#find/-size-100c-print

11.使用depth选项:

查找时使用depth命令,可以先在指定文件的根目录下查找所有文件,再进入子目录中查找,有时备份可能需要这样做。

如:从根目录开始,查找名为"con.file"的文件,它将首先匹配所有的文件然后再进入子目录查找:

#find/-name"con.file"-depth-print

12.使用mount选项:

查找文件时,可以只在指定目下查找,而不进入子目录下查找,这可以通过mount指定。

如:

#find.-name"*.xc"-mount-print

13.使用cpio选项:

cpio选项可以用来向磁带设备备份文件或从中恢复文件。结合find,可以在整个文件系统中查找文件,然后用cpio命令将其备份到磁带上。

下面的命令:

#cd/

#findetchomeapps-depth-print|cpio-ivcdc65535-o\

/dev/rmt0

\用来告诉系统,shell命令还没有结束,请忽略\后面的回车。该命令用来将/etc、/home和/apps目录下的文件备份到设备/dev/rmt0中。

上面命令中etc、home、apps前都没有/,这是用了相对路径(用了/就是绝对路径),之所以用相对路径,是因为:

在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/etc,那么在恢复时,就只能恢复到/etc目录中去,别无其他选择。

上面的命令,告诉find命令首先进入/etc目录,然后是/home和/apps目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。

顺便说一下,在上面的例子中cpio命令使用了c65536选项,我本可以使用b选项,不过这样每块的大小只有512字节,而使用了c65536选项后,块的大小变成了64k字节(65536/1024)。

14.使用exec或ok选项:

用find匹配到一些文件之后,可以用exec和ok选项来对其进行某些操作。

用exec和ok的格式是:exec(ok)选项后面跟随着所要执行的命令,然后是一对儿{},一个空格和一个\,最后是一个分号。

如:

#find.-typef-execls-l{}\;

该命令查找并列出匹配到的文件。

#findlogs-typef-mtime+5-execrm{}\;

该命令查找更改时间在5天以前的普通文件,并删除它们。

exec的安全模式:ok

#find.-name"*.log"-mtime+5-okrm{}\;

该命令和用exec的唯一区别就是该命令在删除时,会给出提示。

#find/etc-name"passwd*"-execgrep"zhy"{}\;

Linux命令(shell)从入门到精通 学习笔记之2 使用find和xargs

该命令首先匹配所有名为"passwd*"的文件,如:passwd、pssswd.old、passwd.bak,然后执行grep命令查看在这些命令中是否存在zhy用户。

find的其他例子:

#find~-print(find$home-print)

查找所有文件

#find.-typef-perm4755-print

查找suid置位,文件属主具有读、写、执行权限,其他用户具有读和执行权限的文件。

#find/-groupzhy-print

查找属主是zhy的文件。

#$find/logs-name'admin.log[0-9][0-9][0-9]'-mtime+7-execrm{}\;

查找具有指定名称的,修改日期在7天以前的文件,并删除。

#find/dev/rmt-print

查找系统中所有的rmt磁带设备。

15.使用xargs选项:

为什么使用xargs:

在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

例:

#find/-typef-print|xargsfile|tee/root/shell/xargs.log

查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件,并将输出导入到xargs.log文件中。用-exec试下,就是:

#find/-typef-print-execfile{}\;|tee/root/shell/exec.log

通过对比xargs.log和exec.log,发现二者的输出,确实一样,但执行xargs命令的效率明显比-exec快很多(从执行速度上看)。

#find/apps/audit-perm777-print|xargschmodo-w

在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回其他用户的写权限。

#find/-typef-print|xargsgrep"device"

用grep命令在所有的普通文件中搜索device这个词:

#find.-name\*-typef-print|xargsgrep"192.168.5.29"

该命令在当前目录下的所有普通文件中搜索192.168.5.29这个词,\用来取消find命令中的*在shell中的特殊含义。