find pathname -options [-print -exec -ok …]
find pathname -options [-print -exec -ok ...]
详细参数参考: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的文件
参考: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脚本会更新文件的atimemodify time
(-mtime): 它代表着最近一次文件内容被修改
的时间change time
(-ctime):它代表着最近一次文件状态改变
的时间 ,是status change time,是在写入文件
、更改所有者
、权限
或链接设置
时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。当然,我们既然可以查看当前的atime、mtime、ctime,那肯定也可以查看几天前或者几天之内被改过或者访问过的文件。Linux为我们提供了一个简便的查询方式,那就是 +n 和 -n。下面以 -mtime 举例说明:
例如:将系统24小时内更改过内容的档案列出 。
find / -mtime 0
那么,找 “5天之内被更改过的档案名” 就是 find / -mtime -5 ,找“5天前的那一天被更改过的档案名” 就是 find / -mtime 5 ,找“5天之前被更改过的档案名” 就是 find / -mtime +5。我们可以看出有没有 “+,-”的差别是很大的。下面用图来说明一下:
由这个时光轴我们可以知道,最右边为当前时,+5 代表大于等于 6 天前的档案名, -5 代表小于等于 5 天内的档案名,5 则是代表 5-6 那一天的档案名。
-print
: find命令将匹配的文件输出到标准输出。-exec
: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;
,注意{ }和\;之间的空格。-ok
: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。参考: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 {} \;
首先,我们在目录中搜索含有固定字符串文件的命令:
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
命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]
就是将command 1
的标准输出结果,通过管道|
变成xargs
的标准输入,然后xargs
再将此标准输入变成参数,传给[command 2]
。这样一来,通过xargs
命令,我们便可以在管道后面使用那些不接收标准输入的命令了。例如[command 1]|xargs ls
,是不是很熟悉?
find . -name '*.py' |grep test
,是将前面命令的标准输出作为标准输入传给了grep test,那么grep是从这些标准输入寻找test字符,也就是文件名组成的字符流。可以看到最终选择出的是这些文件名。find . -name '*.py' |xargs grep test
,通过xargs,find得到的文件名成为了参数传给后面的grep,那么这时候这些文件名就是实实在在的文件标识,grep接收后会按正常的使用方式在各文件中搜寻字符串。xargs还有指定参数位置的作用。假设我们要将目录下所有的.py文件放到Python目录中去,可以使用命令
find . -name ‘*.py’ | xargs -I {} mv {} ./Python
参数-I指定了管道前命令作为参数所应该在管道后面命令的位置。
我们在查看很多命令手册时,手册会说明命令的使用方法。例如
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