• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
聪聪451 显示全部楼层 发表于 2021-10-26 13:27:23 |阅读模式 打印 上一主题 下一主题
1. 利用 find 可以查找出符合某一特性(如权限、属主、长度、类型、名字等)的文件或目次,结合 -exec、-ok 和 -xargs,可以完成更多的工作。
2.find 的 name 选项:
根据文件名字匹配查找,如在自己的根目次下查找符合 *.txt 的文件:

扩展:find / ! -name "myshell" -print
(
从上面的输出可以看出,对于 root 用户而言:
~
$HOME
/root
代表的都是同一个目次,就是 /root。
特别的,对于用户 xxx 而言, $HOME 和 ~ 代表的就是 /xxx 目次,这个目次的位置(以 zhy 用户为例),如下:

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

是直接位于根目次下的(管理员是老大嘛,固然厚待咯)。
)
在当前目次下查找,就用 “.“:
# 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 . -perm 755 -print
如:

扩展:find . ! -perm 755 -print
4. find 的 prune 选项:
查找文件时,忽略某个目次,如:
假如希望在 /apps 目次下查找文件,但不希望在 /apps/bin 目次下查找,可以用:
# find /apps -name "/apps/bin" -prune -o -print
5. user 和 nouser 选项:
user : 根据文件的属主查找文件:
# find . -user zhy -print

在linux下,可能有些属主,可能被管理员删掉了,这个时间,就能用-nouser 选项找到那些在属主在 /etc/passwd文件中没有有用账户的文件。在用 -nouser 时,不用给出用户名。
# find / -nouser -print
6. 利用 group 和 nogroup:
就像利用 user 和 nouser 一样,group 与 nogroup 选项能找出属于某一用户组的文件,和用户组已经不存在的文件。
# find / -group zhy -print
# find / -nogroup -print
7. 利用 -mtime 选项:
该选项可以查找指定时间内或指定时间外修改的文件,假如系统忽然没有可用空间了,很有可能某一个文件的长度在此期间增长敏捷,这时就可以用 mtime 选项来查找如许的文件:

-1表现1日(24小时)之内更改过的文件。
+2表现2日(48小时)之前更改过的文件。

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

通过下面的下令,我们就可以找出更改时间介于这两者的文件了:
# find / -newer age.awk ! -newer belts.awk -exec ls -l {} \;
从上面可以看出,这种比力必须有参考的文件,好比要查找更改时间在两个小时以内的文件,就必须有一个更改时间正好在两个小时之前谁人时刻的文件可以供参考。这里我们可以通过 touch 来创建一个指定更改时间的文件:
假如如今是 12月26日10点41分,那就需要创建一个更改时间在12月26日08点41分的文件:
# touch -t 12260841 oldfile
然后通过:
# find / -newer oldfile -print
来查找更改时间在两个小时内的文件。
9. 用 type 查找指定类型的文件:
在根目次下,查找所有的目次:
# find / -type d - print
查找除目次以外所有类型的文件:
# find / ! -type d -print
查找所有符号链接文件:
# find / -type l -print
查找所有普通文件:
# find / -type f -print
10. 利用 size 选项:
利用可以查找指定长度的文件,可以以字节为单元,也可以用块为单元,1块 = 512字节(0.5M)。
以字节为单元,需要在数字背面加 c,如:
在根目次下查找文件长度大于 1M 的文件:
# find / -size +1000000c -print
用块表现就是:
# find / -size +2 -print
查找刚好是100字节的文件:
# find / -size 100c -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 /
# find etc home apps -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 . -type f -exec ls -l {} \;
该下令查找并列出匹配到的文件。
# find logs -type f -mtime +5 -exec rm {} \;
该下令查找更改时间在5天从前的普通文件,并删除它们。
exec 的安全模式:ok
# find . -name "*.LOG" -mtime +5 -ok rm {} \;
该下令和用 exec 的唯一区别就是 该下令在删除时,会给出提示。
# find /etc -name "passwd*" -exec grep "zhy" {} \;

该下令起首匹配所著名为 "passwd*" 的文件,如:passwd、pssswd.old、passwd.bak,然后执行 grep 下令检察在这些下令中是否存在 zhy 用户。
find 的其他例子:
# find ~ -print ( find $HOME -print)
查找所有文件
# find . -type f -perm 4755 -print
查找 suid 置位,文件属主具有读、写、执行权限,其他用户具有读和执行权限的文件。
# find / -group zhy -print
查找属主是 zhy 的文件。
# $ find /logs -name 'admin.log[0-9][0-9][0-9]' -mtime +7 -exec rm {} \;
查找具有指定名称的,修改日期在7天从前的文件,并删除。
# find /dev/rmt -print
查找系统中所有的 rmt 磁带装备。
15. 利用 xargs 选项:
为什么利用 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选项会为处置惩罚每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;如许在有些情况下就会出现进程过多,系统性能降落的题目,因而服从不高;而利用 xargs 下令则只有一个进程。另外,在利用 x a rg s下令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该下令的选项及系统内核中相应的可调参数来确定。
例:
# find / -type f -print | xargs file | tee /root/shell/xargs.log
查找系统中的每一个普通文件,然后利用 x a rg s下令来测试它们分别属于哪类文件,并将输出导入到 xargs.log 文件中。用 -exec 试下,就是:
# find / -type f -print -exec file {} \; | tee /root/shell/exec.log
通过对比 xargs.log 和 exec.log ,发现二者的输出,确实一样,但执行 xargs 下令的服从显着比 -exec 快很多(从执行速率上看)。
# find /apps/audit -perm 777 -print | xargs chmod o-w
在/ a p p s / a u d i t目次下查找所有用户具有读、写和执行权限的文件,并收回其他用户的写权限。
# find / -type f -print | xargs grep "device"
用 grep 下令在所有的普通文件中搜刮device这个词:
# find . -name \* -type f -print | xargs grep "192.168.5.29"
该下令在当前目次下的所有普通文件中搜刮 192.168.5.29 这个词,\用来取消 find 下令中的*在 shell 中的特别寄义。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作