@guhuizaifeiyang
2017-11-17T15:03:02.000000Z
字数 4050
阅读 1713
Linux
使用格式 : find [指定查找目录] [查找规则] [查找完后执行的action]
选项与参数:
1. 与时间有关的选项:其中表示天的有-atime,-ctime与-mtime ;表示分钟的有-amin, -cmin与-mmin。-a,-c,-m分别代表访问过、状态改变过、修改过。
以 -mtime 说明
-mtime n :n 为数字,意义为在 n天之前的『一天之内』被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。
Sample:
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
android@user-Precision-T1700:~$find / -mtime 0
范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
android@user-Precision-T1700:~$find /etc -newer /etc/passwd
2. 与使用者或组名有关的参数:
-uid n :n 为数字,这个数字是用户的账号 ID,亦即 UID ,这个 UID 是记录在 /etc/passwd里面与账号名称对应的数字。
-gid n :n 为数字,这个数字是组名的 ID,亦即 GID.
-user name :name 为使用者账号名称喔!
-group name:name 为组名喔,例如 users ;
-nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!
范例三:搜寻 /home 底下属于 dmtsai 的文件
[root@study ~]# find /home -user dmtsai
# 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时, # 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!
范例四:搜寻系统中不属于任何人的文件
[root@study ~]# find / -nouser
# 透过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软件时。
3. 与文件权限及名称有关的参数:
-name filename:搜寻文件名为 filename 的文件;
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有: c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是『 -size +50k 』
-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 装置文件 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。
-perm mode :搜寻文件权限『刚好等于』 mode 的文件,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
-perm -mode :搜寻文件权限『必须要全部囊括mode的权限』的文件,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744, 当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm /mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻 -rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在!
Samples:
在当前目录下所有.cpp文件中查找efg函数
find . -name "*.cpp" | xargs grep 'efg'
xargs展开find获得的结果,使其作为grep的参数
想要在自己的根目录中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。
find ~ -name "*.log" -print
想要在当前目录及子目录中查找所有的' *.log'文件,可以用:
find . -name "*.log" -print
不想要在当前目录及子目录中查找所有的'*.log'文件,可以用:
find . ! -name "*.log" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
find . -name "[A-Z]*" -print
想要在/etc目录中查找文件名以host开头的文件,可以用:
find /etc -name "host*" -print
想要查找$HOME目录中的文件,可以用:
find ~ -name "*" -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。
find / -name "*" -print
如果想在当前目录及子目录中查找文件名以一个个小写字母开头,最后是4到9加上.log结束的文件:
find . -name "[a-z]*[4-9].log" -print
忽略文件名大小写
find . -iname 'name'
将文件路径作为一个整体进行匹配
fine . -path "*tinno/pinoy"
使用-mindepth参数设置最小深度,使用-maxdepth参数设置最大深度:
$ find . -maxdepth 1 -type f -print
-a 连接两个不同的条件(两个条件必须同时满足)
find /etc -size +50K -a -size -60K
-o 连接两个不同的条件(两个条件满足其一即可)
$ find . -size +1M -o -type f
根据文件类型来查找文件
-type
f // 普通文件
d //目录文件
l //链接文件
b //块设备文件
c //字符设备文件
p //管道文件
s //socket文件
根据大小来查找文件
-size
find /tmp -size 2M //查找在/tmp 目录下等于2M的文件
find /tmp -size +2M //查找在/tmp 目录下大于2M的文件
find /tmp -size -2M //查找在/tmp 目录下小于2M的文件
想查找当前文件夹及子文件夹里的同时含有b字符和3字符的文件:用到正则表达式技术
find . -regex ‘.*b.*3’
-prune(目前还没整明白)
-prune is an action, not a test. It alters the "to-do" list, but always return true;
过淲掉所有.xml文件
find . -name '.xml' -prune -o -name "*Activity*"
跳过./src/emacs目录
find . -path './src/emacs' -prune -o -name "*Activity*"
Sample:
find /etc -size +50K -a -size -60K -exec ls -l {} \;
find /etc -size +50K -a ! -user root -type f -exec ls -l {} \;
备注:
1.{}代表的是由find找到的内容
2. -exec一直到\;是关键词,代表find额外动作的开始(-exec)到结束(\;),在这中间的就是find指令内的额外动作
find /etc -size +1500K -o -size 0
格式 grep 'expression' file
其中,expression采用正则表达式,file采用通配符。
grep的正则表达式有许多局限,比如不支持多选,所以推荐用egrep。
正则表达式元字符集:
grep | egrep | |
---|---|---|
^ | ^ | 锚定行的开始 |
$ |
$ |
锚定行的结束 |
. | . | 匹配一个非换行符的字符 |
* | * | 匹配零个或多个先前字符 |
[] | [] | 匹配方框里的字符 |
\? \+ |
? + | 匹配优先量词 |
\( \) |
( ) | 分组 |
\{ \} |
{ } | 匹配优先量词 |
\b | \b | 单词分界符 |
\w\W | \w\W | 单词中的字符 |
常用通配符的含义:
*
:匹配0个或多个字符举个粟子:
# grep ‘energywise’ *
# 在当前目录搜索带'energywise'行的文件
# grep -r ‘energywise’ *
# 在当前目录及其子目录下搜索'energywise'行的文件
# grep -l -r ‘energywise’ *
# 在当前目录及其子目录下搜索'energywise'行的文件,但是不显示匹配的行,只显示匹配的文件
# grep -i pattern files
# 不区分大小写
# grep -l pattern files
# 只列出匹配的文件名
# grep -L pattern files
# 列出不匹配的文件名
# grep -w pattern files
# 匹配整个单词
# grep -E pattern1|pattern2 files
# 匹配pattern1或pattern2
# grep -E '123|abc' filename
# grep pattern1 files | grep pattern2
# 查找既匹配pattern1又匹配pattern2的行
# \'^M\' 以M开头的行
# \'M$\' 以M结尾的行
# \'^[124ab]\' 以1,2,4,a,b开头的行
只在目录中递归搜索所有的.c和.cpp文件:
$ grep "main()" . -r --include=*.{c,cpp}
在搜索中排除所有的README文件:
$ grep "main()" . -r --exclude "README"
通配符与正同表达式表示的含义并不相同。
以find为例:
find . -name '*.java'
-name参数后面跟的是通配符,'.'在通配符中不是元字符,在正则表达式中是元字符,能匹配除了换行符之外的任何字符。