文章目录

  • 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之find相关推荐

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  2. Linux shell 学习笔记(16)— shell 入门总结

    1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...

  3. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  4. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务

    1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...

  5. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  6. Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)

    1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...

  7. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符

    1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...

  8. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  9. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

  10. Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)

    1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...

最新文章

  1. ​图像识别算法超低代码开发方案
  2. 如何让Python不回显获取密码输入
  3. java返回有什么用,java中的return this什么时候用,返回的是类里面的方法类型,还是实例类?上面的代码什么意思...
  4. 启明云端分享|注意了,ESP-12F和ESP-12S虽然只有一个字母不同,但在选型时,要注意了,ESP-12F底部是有焊盘的!
  5. android开发环境 国内镜像 及Android SDK manager使用国内服务器方法
  6. python作中国地图背景气泡图_exce表格中怎么制作中国地图背景数据气泡图
  7. LeetCode 1826. 有缺陷的传感器(枚举)
  8. SpringBoot—启动报错Exception in thread “main“ java.lang.ClassNotFoundException
  9. 数组名不等于指针---sizeof()函数求数组大小错误问题
  10. gstreamer向appsrc发送帧画面的代码
  11. graphpad做饼图_超省钱的早餐攻略!这些边角料可别扔,多做一步变大餐!
  12. Google账户解封秘籍:这样申诉,分分钟解封Google 账户!
  13. 三星手机如何通过Exchange账户同步联系人到手机中?
  14. 【原创开源应用第2期】基于RL-USB和RL-FlashFS的完整NAND解决方案,稳定好用,可放心用于产品批量
  15. APM32F030多通道ADC采样
  16. 捷讯fw300r虚拟服务器口号,迅捷FW300R无线路由器WDS无线桥接设置方法
  17. myeclipse 修改项目名Tomcat启动项目报错java.lang.IllegalArgumentException: Can't convert argument: null...
  18. 关于leanote(蚂蚁笔记私服搭建安装)步骤
  19. LeetCode-334. 递增的三元子序列 Python3版本
  20. 无失真传输matlab原理,信号与系统实验(MATLAB版)实验23综合实验4——无失真传输系统.ppt...

热门文章

  1. 315Mhz、433Mhz无线遥控信号的解码分析和模拟
  2. 非常可乐(九度 OJ 1457)
  3. 计算机联锁控制系统的软件应具备信号操作功能,车站信号计算机联锁控制系统—软件.ppt...
  4. Advanced Installer轻松带你入门
  5. 网页游戏开发入门教程
  6. 红黑树 键值_大厂面试官:说一下JDK1.8 HashMap有哪些亮点?
  7. 提取邮件内容 html,整个Html内容以邮件的方式发送出去(取出标签包含的用户输入信息)...
  8. oracle 的SGA与PGA分析
  9. 这可能是实现高斯模糊(毛玻璃)最简单的库了
  10. python实现UDP