shell之find

文章目录

  • find
    • 1. 格式
    • 2. 参数-atime、-mtime、-ctime
    • 3. [-print -exec -ok ...]
      • find命令之exec
    • 4. find与xargs
      • 参数与标准输入
      • 管道
      • xargs命令

find

1. 格式

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

find pathname -options [-print -exec -ok ...]
  • pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
  • options常用:
    • -name 按照文件名查找文件
    • -mtime -n +n 按照文件的更改时间来查找文件(见下详解)
    • -perm 按照文件权限来查找文件
    • -size +n/-n单位 大于n单位/小于n单位的文件
    • -type 查找某一类型的文件,诸如:
      b - 块设备文件。
      d - 目录。
      c - 字符设备文件。
      p - 管道文件。
      l - 符号链接文件。
      f - 普通文件。

详细参数参考:https://www.cnblogs.com/yinzhengjie/p/6207318.html
如:

$ find . -name "*.t" -type f #查找文件类型的.t结尾的
./a1.t
./a2.t

$ find . -type f -size -200M #查找小于200M的文件
$ find . -type f -size +200M #查找大于200M的文件

2. 参数-atime、-mtime、-ctime

参考:https://www.cnblogs.com/qiaopei/p/5515189.html
我们知道 Linux里面一切皆文件 ,那么我们能否查看一个文件是何时创建的呢?答案是否定的。那我们可以知道些文件关于时间的什么信息呢?那就不得不说文件状态的三个时间了,它们分别是 -atime, -ctime 和 -mtime。

先让我们来看一个Linux下的文件信息:

$ stat access.log 
  File: `access.log'
  Size: 1634348739      Blocks: 4193280    IO Block: 4096   regular file
Device: fd1ah/64794d    Inode: 151261236   Links: 1
Access: (0640/-rw-r-----)  Uid: (  501/  hadoop)   Gid: (  501/  hadoop)
Access: 2019-01-13 00:00:00.499591353 +0800
Modify: 2019-01-13 16:08:20.957471279 +0800
Change: 2019-01-13 16:08:20.957471279 +0800

详解:

  • 最近访问时间 access time (-atime):显示一个文件的内容或者运行一个shell脚本会更新文件的atime
  • 最近更改时间 modify time (-mtime): 它代表着最近一次文件内容被修改的时间
  • 最近状态改动时间 change time(-ctime):它代表着最近一次文件状态改变的时间 ,是status change time,是在写入文件更改所有者权限链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。

当然,我们既然可以查看当前的atime、mtime、ctime,那肯定也可以查看几天前或者几天之内被改过或者访问过的文件。Linux为我们提供了一个简便的查询方式,那就是 +n 和 -n。下面以 -mtime 举例说明:

  • -mtime n : n为数字,意思为在n天之前的“一天之内”被更改过内容的文件
  • -mtime +n : 列出在n天之前(不含n天本身)被更改过内容的文件名
  • -mtime -n : 列出在n天之内(含n天本身)被更改过内容的文件名

例如:将系统24小时内更改过内容的档案列出 。

find / -mtime 0

那么,找 “5天之内被更改过的档案名” 就是 find / -mtime -5 ,找“5天前的那一天被更改过的档案名” 就是 find / -mtime 5 ,找“5天之前被更改过的档案名” 就是 find / -mtime +5。我们可以看出有没有 “+,-”的差别是很大的。下面用图来说明一下:

由这个时光轴我们可以知道,最右边为当前时,+5 代表大于等于 6 天前的档案名, -5 代表小于等于 5 天内的档案名,5 则是代表 5-6 那一天的档案名。

3. [-print -exec -ok …]

  • -print: find命令将匹配的文件输出到标准输出。
  • -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
  • -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

find命令之exec

参考:https://www.cnblogs.com/think-in-java/p/5712197.html
find 是我们很常用的一个Linux命令,但是我们一般查找出来的额并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。
exec解释:
  -exec 参数后面跟的是 command 命令,它的终止是以“”为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。 
  {} 花括号代表前面find查找出来的文件名
  
如删除14日以前的文件:

find .  -type f  -mtime +14 -exec rm {} \;

4. find与xargs

首先,我们在目录中搜索含有固定字符串文件的命令:

find . -name '*.py' |xargs grep test

如果使用如下命令:

find . -name '*.py' |grep test

结果并不是自己所期望的。此命令只是找出文件名*.txt有test的情况。
xargs的意思就是产生某个命令的参数

参数与标准输入

这两个词我们在Linux命令中是很常见的。但是参数和标准输入其实是有区别的。我们日常使用的很多命令,例如ls -lah .中。l, a, h ,.都是命令ls的参数。至于标准输入,可以说它某种流数据。而通常来讲标准输入的流数据来源就是我们的终端输入。在Linux命令中,有些命令可以接收标准输入,有些是不能的。像上面的ls,就是只能接收参数,不能接收标准输入。像cat命令或echo命令,这些是可以的。

怎么分辨一个命令可不可以接收标准输入?很简单,当你敲完命令回车后,终端会等待接收你的输入,例如当你在终端输入cat后,终端会等待你输入字符,当你输入一些字符后,然后按Ctrl-C发送终止符号。这时cat命令接收标准输入完毕,执行命令,也就是将刚才键入的内容输出的标准输出上(屏幕)。

管道

管道的作用是将前面命令的标准输出作为后面命令的标准输入。这里要注意,后面的命令接收的是标准输入,所以如果命令不支持接收标准输入,那么就不能直接使用管道,例如常用的ls命令,只能使用参数,而不能使用标准输入,所以[command] | ls是不能使用的。而命令如echo或cat就可以。那么肯定有方法来实现这些不能使用标准输入的命令与管道结合,这时候xargs便出场了。

xargs命令

xargs命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]就是将command 1的标准输出结果,通过管道|变成xargs的标准输入,然后xargs再将此标准输入变成参数,传给[command 2]。这样一来,通过xargs命令,我们便可以在管道后面使用那些不接收标准输入的命令了。例如[command 1]|xargs ls,是不是很熟悉?

  • grep是支持标准输入的。那么对于第一个命令find . -name '*.py' |grep test,是将前面命令的标准输出作为标准输入传给了grep test,那么grep是从这些标准输入寻找test字符,也就是文件名组成的字符流。可以看到最终选择出的是这些文件名。
  • 而对于第二个命令find . -name '*.py' |xargs grep test,通过xargs,find得到的文件名成为了参数传给后面的grep,那么这时候这些文件名就是实实在在的文件标识,grep接收后会按正常的使用方式在各文件中搜寻字符串。
  1. xargs还有指定参数位置的作用。假设我们要将目录下所有的.py文件放到Python目录中去,可以使用命令
    find . -name ‘*.py’ | xargs -I {} mv {} ./Python
    参数-I指定了管道前命令作为参数所应该在管道后面命令的位置。

  2. 我们在查看很多命令手册时,手册会说明命令的使用方法。例如
    grep [OPTIONS] PATTERN [FILE...],也就是命令的最后一个位置是文件名[FILE]
    这里要注意这个文件名[FILE]也是参数。

参考:http://fatmouse.xyz/2016/05/10/2016-05-10-find-grep-xargs-and-pipe/
https://www.cnblogs.com/peida/archive/2012/11/15/2770888.html

你可能感兴趣的:(shell)