您的位置:首页 > 运维架构 > Shell

shell find和xargs学习(七)

2015-10-30 23:17 405 查看
shell 的find和xargs 学习:

在Linux系统中有时我们需要按照某种特征来查找文件,在我们不知道文件在何处时,文件多时无异于大海捞针,find是一个非常有效的工具,它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。

1.find 命令的一般形式为

find pathname -options [-print -exec -ok]

下面是该命令的参数:

pathname find命令所查找的目录路径。例如用.来表示当前目录(find默认就是查找当前目录),用/来表示系统根目录。

-print find命令将匹配的文件输出到标准输出。

-exec find 命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'commond ' {} \;,注意{} 和\;直接的空格,否则会报错:find: missing argument to `-exec'。

-ok 和-exec的作用相同,只不过以一种更好的方式来执行该参数所给出的shell命令,在执行每一个命令之前,都给出提示,让用户来确认是否执行。

2.find命令选项

find命令有很多选项或表达式,每个选项前面跟随一个横杠-

-name 按照文件名查找文件。

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

-prune 使用这一选项可以使find命令不在当前制定目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略

-user 按照文件属主来查找文件

-group 按照文件所属的组来查找文件

-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。

-type 查找某一类型的文件,诸如:

b -块设备文件

d -目录

c -字符设备文件

p -管道文件

l -符号链接文件

f -普通文件。

-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。

-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

2.1 使用name选项

查找文件以.sh 结尾的文件 后面-print可以省略,因为默认就是打印

[root@hadoop06 shtest]# find -name "*.sh" -print

./rename.sh

./login.sh

./runCreateTxt.sh

想要查找当前目录中以一个大写字母开头的文件

[root@hadoop06 shtest]# find -name "[A-Z].sh" -print

./A.sh

如果想要在当前目录中查找以字母开头,跟着是数字,最后是*.txt的文件,下面的命令就能够返回aa*34*.txt的文件

[root@hadoop06 shtest]# find -name "[a-z]*[0-9]*.txt" -print

./sfsdfs9999.txt

./bb88.txt

2.2 按照更改时间查找文件

如果希望按照更改时间来查找文件,可以使用mtime选项,如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选秀来查找这样的文件,使用-来限定更改时间在距进入n日以内的文件,而用+来限定更改时间在距今n日以前的文件。

希望在系统根目录下查找更改时间在5日以内的文件

$ find / -mtime -5 -print

为了在/var/www目录下查找更改时间在3日以前的文件可以用:

$ find /var/www -mtime +3 -print

2.3 使用type选项

如果要在/etc目录下查找所有目录,可以用:

$ find /etc -type d -print

在当前目录下查找除了目录以外的所有类型文件,可以用:

$ find ! -type d -print

2.4 使用size 选项

可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以以字节来计算,以字节计算文件长度的表达形式为Nc;以块计量文件长度只用数字表示既可。

在当前目录下查找文件长度大于1M字节的文件可以用

$ find -size +1000000c -print

在/home/apace目录下查找文件长度恰好为100字节的文件,’

$ find /home/apache -size 100c -print

查找目录下长度超过10块的文件

$ find -size +10 -print

查找目录下为0的文件

$ find -size 0 -print

2.5 使用depth选项

在使用find命令时,可能希望先匹配到所有的文件,再在子目录中查找,使用depth选项就可以使find这样做,这样做的一个原因就是,当使用find命令向磁带上备份文件系统时,希望先备份所有文件,其次再备份子目录中的文件。

在下面的例子中,find命令从文件系统的根目录开始,查找一个叫conf.xml的文件,它将先匹配所有的文件然后再进入子目录中查找

$ find / -name "conf.xml" -depth -print

2.6 使用exec或ok开执行shell命令

当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用 -exec选项,一旦find 命令匹配到相应文件,就可以用-exec选项来对其进行操作 在有些操作系统中只允许-exec 选项执行诸如ls 或ls -l 这样的命令

exec 选项后面跟随着所要执行的命令,然后是一对{}.一个空格和一个\ ,最后是分号,一定要注意空格否则会报严重的错

为了用ls -l 命令能够列出所匹配的到文件,可以把ls -l 命令放在find 命令的-exec选项中,如:

find . -type f -exec ls -l {} \;

-rw-r--r--. 1 root root 270 Oct 31 06:17 ./db.sh

-rw-r--r--. 1 root root 109 Oct 27 00:59 ./shtest/num.sh

-rw-r--r--. 1 root root 15 Oct 27 01:21 ./shtest/awk.txt

上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l 命令将它们列出。

为了在删除日志目录中5日以前的文件可以用:

find logs -type f -mtime +1 -exec rm {} \;

注意:删除之前最好用ls -l 看一下 是否是需要删除的文件

下面使用ok 实现上面同样的操作

find . -name "*.sh" -mtime +1 -ok rm {} \;

< rm ... ./rename.sh > ? y#每个操作都会让你手动确认的

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命令时,究竟是一次获取所有的参数,还是分

批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参

数来确定。

下面的例子在整个系统中查找内存信息转储文件 (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 中的特殊含义

上面有些参考:chain.pub.com linux_shell 一书
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: