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接收后会按正常的使用方式在各文件中搜寻字符串。
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
shell之find相关推荐
- jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理
准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...
- Linux shell 学习笔记(16)— shell 入门总结
1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...
- 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...
- Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务
1. 处理信号 1.1 Linux 信号 常见的 Linux 信号如下表所示: 信号 值 描述 1 SIGHUP 挂起进程 2 SIGINT 终止进程 3 SIGQUIT 停止进程 9 SIGKILL ...
- Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)
1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...
- Linux shell 学习笔记(10)— 处理用户输入(命令行读取参数、读取用户输入、超时处理)
1. 命令行参数 向 shell 脚本传递数据的最基本方法是使用命令行参数.命令行参数允许在运行脚本时向命令行添加数据. $ ./addem 10 30 本例向脚本 addem 传递了两个命令行参数( ...
- Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符
1. for 语句 bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值. for var in list docommands done 也可以 ...
- Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)
1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then commands fi 或者 if command; t ...
- Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...
- Linux shell 学习笔记(5)— 文件权限(添加、修改、删除用户及创建、修改群组)
1. Linux的安全性 Linux 安全系统的核心是用户账户.每个能进入 Linux 系统的用户都会被分配唯一的用户账户.用户对系统中各种对象的访问权限取决于他们登录系统时用的账户. 用户权限是通过 ...
最新文章
- ​图像识别算法超低代码开发方案
- 如何让Python不回显获取密码输入
- java返回有什么用,java中的return this什么时候用,返回的是类里面的方法类型,还是实例类?上面的代码什么意思...
- 启明云端分享|注意了,ESP-12F和ESP-12S虽然只有一个字母不同,但在选型时,要注意了,ESP-12F底部是有焊盘的!
- android开发环境 国内镜像 及Android SDK manager使用国内服务器方法
- python作中国地图背景气泡图_exce表格中怎么制作中国地图背景数据气泡图
- LeetCode 1826. 有缺陷的传感器(枚举)
- SpringBoot—启动报错Exception in thread “main“ java.lang.ClassNotFoundException
- 数组名不等于指针---sizeof()函数求数组大小错误问题
- gstreamer向appsrc发送帧画面的代码
- graphpad做饼图_超省钱的早餐攻略!这些边角料可别扔,多做一步变大餐!
- Google账户解封秘籍:这样申诉,分分钟解封Google 账户!
- 三星手机如何通过Exchange账户同步联系人到手机中?
- 【原创开源应用第2期】基于RL-USB和RL-FlashFS的完整NAND解决方案,稳定好用,可放心用于产品批量
- APM32F030多通道ADC采样
- 捷讯fw300r虚拟服务器口号,迅捷FW300R无线路由器WDS无线桥接设置方法
- myeclipse 修改项目名Tomcat启动项目报错java.lang.IllegalArgumentException: Can't convert argument: null...
- 关于leanote(蚂蚁笔记私服搭建安装)步骤
- LeetCode-334. 递增的三元子序列 Python3版本
- 无失真传输matlab原理,信号与系统实验(MATLAB版)实验23综合实验4——无失真传输系统.ppt...
热门文章
- 315Mhz、433Mhz无线遥控信号的解码分析和模拟
- 非常可乐(九度 OJ 1457)
- 计算机联锁控制系统的软件应具备信号操作功能,车站信号计算机联锁控制系统—软件.ppt...
- Advanced Installer轻松带你入门
- 网页游戏开发入门教程
- 红黑树 键值_大厂面试官:说一下JDK1.8 HashMap有哪些亮点?
- 提取邮件内容 html,整个Html内容以邮件的方式发送出去(取出标签包含的用户输入信息)...
- oracle 的SGA与PGA分析
- 这可能是实现高斯模糊(毛玻璃)最简单的库了
- python实现UDP