find、xargs、grep

find

find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。

find命令一般简化形式(还可以更复杂,更多操作) find [path...] [expression]

path:find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录

touch一些测试文件

$ ls
hello.cpp  kg.lua  kobebryant  Kobe.lua

参考:http://tiger-hu.iteye.com/blog/1927754

按名字查找

-name 和 -iname的区别在于前者对大小写敏感,后者不敏感

$ find . -name "k*"
./kobebryant
./kg.lua

$ find . -iname "k*"
./kobebryant
./Kobe.lua
./kg.lua

按时间查找

 -atime  -n[+n]: 找出文件访问时间在n日之内[之外]的文件。
    -ctime  -n[+n]: 找出文件更改时间在n日之内[之外]的文件。
    -mtime -n[+n]: 找出修改数据时间在n日之内[之外]的文件。
    -amin   -n[+n]: 找出文件访问时间在n分钟之内[之外]的文件。
    -cmin   -n[+n]: 找出文件更改时间在n分钟之内[之外]的文件。
    -mmin  -n[+n]: 找出修改数据时间在n分钟之内[之外]的文件。

比如:找出一天内修改文件

$ find -ctime -1
.
./hello.cpp
./kobebryant
./Kobe.lua
./kg.lua

基于找到的文件执行操作

 -exec: 对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} ;,注意{}和;之间的空格,同时两个{}之间没有空格。特别注意:分号是必须打,作为-exec的结束符
 -ok:  其主要功能和语法格式与-exec完全相同,唯一的差别是在于该选项更加安全,因为它会在每次执行shell命令之前均予以提示,只有在回答为y的时候, 其后的shell命令才会被继续执行。需要说明的是,该选项不适用于自动化脚本,因为该提供可能会挂起整个自动化流程。

比如:找出60分钟内修改的文件,并执行ls -l ,也就是显示出详情

$ find . -cmin -60 -exec ls -l {} ;
总用量 0
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:29 hello.cpp
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 kg.lua
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 kobebryant
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 Kobe.lua
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:29 ./hello.cpp
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./kobebryant
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./Kobe.lua
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./kg.lua

比如:找出kg为首的文件,提示删除

$ find . -name "kg*" -ok rm {} ;
< rm ... ./kg.lua > ? y
$ ls
hello.cpp  kobebryant  Kobe.lua

按文件所属的owner和group查找:
    -user:      查找owner属于-user选项后面指定用户的文件。
    ! -user:    查找owner不属于-user选项后面指定用户的文件。
    -group:   
查找group属于-group选项后面指定组的文件。
    ! -group: 查找group不属于-group选项后面指定组的文件。

比如

$ find . -user philosophie
.
./hello.cpp
./kobebryant
./Kobe.lua

按指定目录深度查找

-maxdepth: 后面的参数表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,以此类推。在指定该选项后,find只是在找到指定深度后就不在递归其子目录了。下例中的深度为1,表示只是在当前子目录中搜索。如果没有设置该选项,find将递归当前目录下的所有子目录。

$ mkdir hhh

$ cd hhh/

$ touch h.c

$ find . -maxdepth 1 -name "*"    # 当前目录找不到 h.c
.
./hello.cpp
./kobebryant
./hhh
./Kobe.lua


$ find . -maxdepth 2 -name "*"  # 1级子目录找到了h.c
.
./hello.cpp
./kobebryant
./hhh
./hhh/h.c
./Kobe.lua

按文件权限属性查找

补充:文件权限,分别为 所有者、所在组、其他组,八进制数字

$ ll
总用量 12
drwxrwxr-x 3 philosophie philosophie 4096 8月   5 23:56 ./
drwxrwxr-x 3 philosophie philosophie 4096 8月   5 22:26 ../
-rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:29 hello.cpp
drwxrwxr-x 2 philosophie philosophie 4096 8月   5 23:57 hhh/
-rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:27 kobebryant
-rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:27 Kobe.lua

$ find . -perm 664
./hello.cpp
./kobebryant
./hhh/h.c
./Kobe.lua

$ find . -perm 775
.
./hhh

按文件类型查找

 -type:后面指定文件的类型。
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l  - 符号链接文件。
    f  - 普通文件。

$ mkdir kkk

$ find . -type d
.
./kkk
./hhh
$ find . -type d -name "h*"
./hhh

按文件大小查找

-size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
 -empty: 查找空文件。

比如,查找文件大小为0的文件可以这样写

-size [+/-]100[c/k/M/G]: 表示文件的长度为等于[大于/小于]100块[字节/k/M/G]的文件。
    -empty: 查找空文件。

比如

$ find . -size 0 -exec ls -l {} ;
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./b
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./a

也可以

$ find . -empty -exec ls -l {} ;
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./b
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./a

按更改时间比指定文件新或比文件旧的方式查找

-newer file

比如,查找比b更新的文件,也就是更晚创建的文件

$ find . -newer b

查找不比b更新的文件,输出会包括文件b

$ find . ! -newer b

xargs

背景:在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。  

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。

 

比如:找到所有普通文件,并测试每个文件是什么类型的

$ find . -type f -print|xargs file
./b: empty
./c: empty
./a: empty
./t.sh: a /bin/bsah script, ASCII text executable
./hello.lua: ASCII text

grep 

参考:http://blog.csdn.net/zhushuai1221/article/details/53097008

grep (global search regular expression(RE) and print out the line 全局搜索正则表达式并把行打印出来。

作用:它能使用正则表达式搜索文本,并把匹配的行打印出来。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词。

Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

常用的grep选项有:

-c   只输出匹配行的计数。
-i   不区分大小写。
-h   查询多文件时不显示文件名。
-l   查询多文件时只输出包含匹配字符的文件名。
-n   显示匹配行及行号。
-s   不显示不存在或无匹配文本的错误信息。
-v   显示不包含匹配文本的所有行。

比如:

将utils.lua出现local的行取出来

$ grep local utils.lua
local TableDB = require('.TableDB')
local M = {}

显示出来的同时显示行号

$ grep -n local utils.lua
2:local TableDB = require('.TableDB')
3:local M = {}

我这里显示出的local是标记了红色的,原本应该不是默认这样的,要使得查找的关键字的显示颜色应该要这样写

grep -n --color=auto 'local'

但是之所以默认这样是因为~/.bashrc这个文件配置过了,如下

将匹配的行的前2行后3行也打印出来,就拿bashrc这个文件为例,找出配置了grep的地方。(后面的grep不用引号也是可以的)

$ cat ~/.bashrc | grep -n -A3 -B2 'grep'
80- #alias vdir='vdir --color=auto'
81-
82: alias grep='grep --color=auto'
83: alias fgrep='fgrep --color=auto'
84: alias egrep='egrep --color=auto'
85-fi
86-
87-# colored GCC warnings and errors

按文件的内容查找文件

# grep ‘energywise’ *           #在当前目录搜索带'energywise'行的文件  

# grep -r ‘energywise’ *        #在当前目录及其子目录下搜索'energywise'行的文件  

# grep -l -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件  

 

正则表达式

以后再弄

原文地址:https://www.cnblogs.com/i-love-kobe/p/7281296.html