简单示例:find . -type f -name "test"
-type f
普通文件php
-type d
目录-type p
管道-type l
符号连接-name "文件名"
要搜索的文件名
还能够用 -iname
进行大小写无关的搜索node
搜索文件的结果做为下一个命令的参数
使用-exec
参数,示例:linux
find . -type f -iname "*test*" -exec ls -l \{\} \;
*\{\}
是输入参数的占位符,哪里须要放哪里。这里的转义符在个人机器上无关紧要 {}
也能够\;
表示命令的结束*git
加上文件大小限制 -size
find . -type f -name "*.c" -size +100k
搜索当前目录下大于100KB的.C 文件正则表达式
find . -type f -name "*.c" -size -1000c
搜索当前目录下小于1000字节的.C文件 find . -type f -name "*.c" -size 1000c
搜索当前目录下等于1000字节的.C文件
搜索 -1k 无效的,应换为 1024c
支持的单位:c
字节 w
字 k
千字节 M
兆字节 G
1G字节 b
512个字节块,至关于一个扇区,单位是大小写敏感的express
搜索最近修改的文件ctime
最近访问, mtime
最近修改文件内容, atime
最近修改文件的节点信息apache
以ctime
为例, ctime n
表示最近n天之前访问的, ctime -n
表示最近n天以内访问的。 find . -type f -name "*.c" -ctime +1
修改一天之前访问的 .C 文件
*ctime 包括了 mtime, 同时还包括了文件权限、文件所属用户等基本信息的修改
他们的区别参见 Difference between mtime, ctime and atime*
还可使用 cmin
mmin
amin
将时间粒度缩小到分钟svn
搜索指定用户的文件find / -user syslog
搜索属于 syslog用户的文件。命令行
find / -group shadow
搜搜用户组shadow的文件find / -perm 644
搜索644权限的文件find / -perm -644
搜索包含 644权限的文件,例如744unix
find 命令是递归搜索目录的, 能够经过 -maxdepth num
指定递归的深度,该参数建议放在紧跟目录路径后的位置,否则会有一条警告。
基本示例:搜索某个文件中包含关键字: grep 'keyword' filename
多个文件空格分开
-E
扩展正则模式,等价于 egrep
-F
字符串,不使用正则匹配 ,等价于fgrep
-P
perl的正则风格(PCRE)
-G
基本正则模式-E
和-G
主要区别在于, 基本模式下 ?, +, {, |, (, )
这些元字符是失效的,做为普通字符解释。须要在基本模式中使用元字符请加转义符\
。例如我要匹配当前目录下文本中包含{{{
, 须要写成grep -R '{\{3\}' ./*
或者 grep -ER '{{3}' ./*
。
建议将正则部分始终放在单引号中,例如想匹配 php 或 apache应写成 egrep php \|apache
或egrep 'php|apache'
不然 |
在linux 命令行下会被看成一个管道符号
grep,egrep,fgrep的区别请戳我
-i
忽略大小写
-w
单词匹配
-v
显示不匹配的行
-f
使用保存在文件中的正则表达式作匹配egrep -f pattern.txt a.txt b.txt
使用pattern.txt的正则匹配,pattern.txt 内容为 [[:digit:]]{9}
,匹配结果为
a.txt:123456
b.txt:234575
保存正则表达式的文件, 默认一行一个正则,搜索中会将匹配全部正则的结果输出
-x
搜索的文件须要一整行匹配正则表达式
例如将上例中的 a.txt第一行内容123456
修改成 123456 789
, 执行以下命令
egrep -xf pattern.txt a.txt b.txt
, 匹配结果为
b.txt:234575
由于修改后a.txt的内容,再也不一整行都知足正则,也能够理解为正则加了行首行尾的位置匹配: ^expression$
-c
显示匹配的行数,不显示匹配的具体内容
-L
只显示没有匹配的文件名
-l
只显示匹配的文件名
-m num
限制匹配的次数,最大为num个egrep -m 1 -f pattern.txt a.txt b.txt
这样一条指令,只会在每一个文件中匹配 1 次,便开始搜索下一个文件
-o
only matching,只显示匹配一行中匹配到的内容。 grep 默认是将能包含匹配内容所在行输出,使用-o
则只打印匹配的部分
-n
显示匹配行在所匹配文件中行数。
-h
不显示匹配的结果中的文件名列
-r
or -R
递归的搜索目录, 很经常使用
区别在于-R 会搜索符号连接指向的文件或目录; -r 则不会,除非该符号连接在参数中显示指定了一个符号连接,例如
egrep -rn '[[:digit:]]' ./ ./.local/share/systemd/user
,该命令在当前目录下搜索, 还包括了一个符号连接
--exclude=GLOB
跳过文件名匹配'GLOB'的文件,例如在版本库中搜索时egrep --exclude=*.svn -rnf pattern.txt ./
排除版本库的文件
GLOB 中可使用 , ?, []*
--include=GLOB
仅在文件名匹配'GLOB'的文件中搜索
排除多个目录进行搜索grep -rn --color --exclude-dir={node_modules,scripts,tests} "console.log" ./*
mac 下替换多个文件内容grep -rl '10.0.2.118' ./*.js | xargs sed -i -e "s/abc/def/g"
mac 下替换 \t
为空格find . -type f -name "*.js" -exec sed -i '' "s/$(printf '\t')/ /g" \{\} \;
linux 下查找大文件 find /var/logs/ -type f -size +1000000k -exec ls -lh {} \;