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'行的文件
正则表达式
以后再弄