Linux 高级文件搜索命令

Linux就该这么学

Linux的查找命令有5个:
1, find:最常用和最强大的查找命令,可以用它找到任何想找的文件。(迅速在指定的范围内查找到文件)
2,which:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果;
3,type:用于区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。type命令其实不能算查找命令;
4,whereis:只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s);

5,locate:相当于find -name,可快速查找文件

各个命令详解:

一:find:查找任何文件 (则鸡儿强大)
find命令的格式:
find [PATH] [option] [action]  ###(find [OPTIONS] [查找起始路径] [查找条件] [处理动作])
find参数:
1,基于文件名的搜索
与文件名有关的参数:
find / -name filename: 查找文件名为filename的文件。filename可使用正则表达式表示。
find / -iname "PATERN" :不区分名称字母大小写
示例:查找所有文件名为passwd的文件。
[root@176-140-17-46 ~]#  find / -name passwd
/usr/bin/passwd
/etc/pam.d/passwd
/etc/passwd
[root@176-140-17-46 ~]#

2,基于正则表达式的模式查找。
-regex 同样属于测试项。使用-regex时有一点要注意:-regex不是匹配文件名,而是匹配完整的文件名(包括路径)。
示例:当前目录下有一个文件"abar9",如果你用"ab.*9"来匹配,将查找不到任何结果,正确的方法是使用".*ab.*9"或者".*/ab.*9"来匹配。 ‘.*’(查找到的文件带有目录)
[root@176-140-17-46 opt]# find . -regex ".*ab.*9"
./abar9
[root@176-140-17-46 opt]#

3,基于文件大小的搜索
-size  测试项根据文件的大小查找文件,文件大小既可以用块(block)来计量,
也可以用字节来计量。默认情况下以块计量文件大小,若想使用字节来计量只需要在数字参数后加c即可。
与文件大小有关的参数:
-size SIZE:查找文件大小刚好等于SIZE的文件;
-size -SIZE:查找文件大小大于SIZE的文件;
-size +SIZE:查找文件大小小于SIZE的文件。
其中,size的单位有:
c —— byte,字节;
w —— 字(2字节);
b —— bit,块(512字节);
k —— 千字节;
M —— 兆字节;
G —— 吉字节。
示例:
1,查找文件size小于10个字节的文件或目录
find ./ -size -10c
2,查找文件size等于10个字节的文件或目录
find ./ -size 10c
3,查找文件size大于10个字节的文件或目录
find ./ -size +10c
4,查找文件size小于10k的文件或目录
find ./ -size -10k
5,查找文件size小于10M的文件或目录
find ./ -size -10M
6,查找文件size小于10G的文件或目录
find ./ -size -10G
7,搜索大于10KB的文件
find . -type f -size +10k
8,搜索等于10KB的文件
find . -type f -size 10k
9,查找超过1M的文件
find / -type f -size +1M
10,查找等于6字节的文件
find . -size 6c

4,基于文件类型的搜索
与文件类型有关的参数:
-type TYPE:查找文件的类型为TYPE的文件。
TYPE的参数列表有:
f :普通文件;
l :符号连接;
d :目录;
c :字符设备;
b :块设备;
s :套接字;
p :FIFO。
示例:
1,查找/var目录下所有类型为socket的文件:
find /var -type s
2,查找/usr/bin/ 符号链接文件 :
find /usr/bin/ -type l

5,基于目录深度的搜索
与目录深度有关的参数:
-maxdepth n: n为数字,表示向下最大深度限制为n;
-mindepth n: n为数字,搜索出深度距离当前目录至少n个子目录的所有文件。
示例:
1,查找文件,向下最大深度限制为3
find . -maxdepth 3 -type f
2,搜索出深度距离当前目录至少2个子目录的所有文件
find . -mindepth 2 -type f

6,基于时间进行搜索
与时间有关的参数共有 -atime、-ctime、-mtime。下面以 -mtime 说明:
-mtime n: n为数字,列出在n天之前的“一天之内”被更改过的文件名;
-mtime +n:列出在n天之前(不含第n天本身)被更改过的文件名;
-mtime -n:列出在n天之内(不含第n天本身)被更改过的文件名;
-newer file:file为一个存在的文件,列出比file还要新的文件名。
示例:
1,查找文件更新日时在距现在时刻二天以内的文件
find ./ -mtime -2
2,查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2
3,查找文件更新日时在距现在时刻一天以上二天以内的文件
find ./ -mtime 2
4,查找文件更新日时在距现在时刻二分以内的文件
find ./ -mmin -2
5,查找文件更新日时在距现在时刻二分以上的文件
find ./ -mmin +2
6,查找文件更新日时在距现在时刻一分以上二分以内的文件
find ./ -mmin 2
7,查找文件更新时间比文件abc的内容更新时间新的文件
find ./ -newer abc
8,查找/etc目录下,所有比/etc/passwd文件更新的文件。
find /ect -newer /etc/passwd
9,查找文件访问时间比文件abc的内容更新时间新的文件
find ./ -anewer abc
10,查找从现在开始到24小时前,/etc目录下所有改动过内容的文件都会被列出来。
find /etc -mtime 0

7,基于用户或用户组名进行搜索
用户或用户组名有关的参数:
-uid n:n为数字,表示用户的UID;
-gid n:n为数字,表示用户的GID;
-user name:name为用户账号名称;
-group name:name为用户组名;
-nouser:寻找文件的所有者不存在于/etc/passwd的文件;
-nogroup:寻找文件的所有用户组不存在于/etc/group的文件。
示例:
1,查找root用户在/home目录下的所有文件。
find /home -user root
2,查找组名为gname的文件或目录
find ./ -group gname
3,查找属主被删除的文件
find / -nouser -type f
4,查找用户组被删掉的文件
find / -nogroup -type f

8,基于文件权限进行搜索
文件权限有关的参数:
-perm mode:查找文件权限刚好等于mode的文件;
-perm +mode:查找文件权限“包含任一mode的权限”的文件;
-perm -mode:查找文件权限“必须要全部包括mode的权限”的文件
示例:
1,查找权限为644的文件或目录(需完全符合)
find ./ -perm 664
2,查找用户/组权限为读写,其他用户权限为读(其他权限不限)的文件或目录
find ./ -perm -664
3,查找用户有写权限或者组用户有写权限的文件或目录
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w
4,查找所有者权限有读权限的目录或文件
find ./ -perm -u=r
5,查找用户组权限有读权限的目录或文件
find ./ -perm -g=r
6,查找其它用户权限有读权限的目录或文件
find ./ -perm -o=r

9,使用混合查找方式查找文件
参数有:
!   不属于
-and(-a)  并
-or(-o)   或者
示例:
1,在/tmp目录下查找大于10000字节并在最后2分钟内修改的文件
find /tmp -size +10000c -and -mtime +2
2,在/目录下查找用户是fred或者george的文件文件
find / -user fred -or -user george
3,在/tmp目录中查找所有不属于panda用户的文件
find /tmp ! -user panda

10, 1,查找空文件或空目录
find ./ -empty
2,查找空目录并删除
find ./ -empty -type d -delete
3,查找空文件并删除
find ./ -empty -type f -delete

11,find其他:
1, 仅仅查找非隐藏的文件(不显示隐藏文件):

find . !regex"./\.."!−regex".∗/\..∗"

12,清除临时文件
1,每个文件掩码的前面都有 -name. 该列表可以扩展为包括您需要清除的系统中的任何临时文件类型。在代码的编译和连接过程中,程序员及其工具会生成示例中的那些文件类型:a.out, *.o 和 core. 其他的用户通常也会生成类似的临时文件,可以使用如 *.tmp, *.junk等文件掩码来对命令进行相应的编辑。您可能还发现将命令放入一个称作 clean的脚本中非常有用,当需要清除一个目录中的内容的时候就可以执行该脚本。
find . namea.outoname.oonamecore−namea.out−o−name′∗.o′−o−name′core′ -exec rm -f {} \;

13,维护 LOG 和 TMP 文件的存储空间
,1,要为生成大量文件的应用程序维护 LOG 和 TMP 文件存储空间,可以将下列命令放入到每天运行的 cron任务中:
find $LOGDIR -type d -mtime +0 -exec compress -r {} \;
find $LOGDIR -type d -mtime +5 -exec rm -f {} \;
第一个命令找到 $LOGDIR 目录中所有包含在 24 小时内 (-mtime +0) 进行了修改的数据的目录(-type d), 对它们进行压缩 (compress -r {}) 以节省磁盘空间。如果这些目录超过了一个工作周 (-mtime +5),第二个命令则将其删除 (rm -f {}),以便增加磁盘上的可用空间。通过这种方式,cron 任务自动地根据您所指定的时间窗口对目录进行维护。

14,find命令之exec
exec解释:
-exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,
考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。{}花括号代表前面find查找出来的文件名。
示例:
1, ls -l命令放在find命令的-exec选项中
find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
find . -type f -exec ls -l {} \;
2,在目录中查找更改时间在14日以前的文件并删除它们
find . -type f -mtime +14 -exec rm {} \;
3,在目录中查找更改时间在5日以前的文件并删除它们,在删除之前先给出提示
find . -name "*.log" -mtime +5 -ok rm {} \;
4,查找文件移动到指定目录
find . -name "*.log" -exec mv {} .. \;,
5,用exec选项执行cp命令
find . -name "*.log" -exec cp {} test3 \;

15,find -exec中使用grep命令
示例:
find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。
find /etc -name "passwd*" -exec grep "root" {} \;

16,利用管道,

1,把find命令匹配到的文件名传递给xargs命令

find命令配合exec和xargs可以对所匹配到的文件执行几乎所有的命令。

二,which:查找系统命令位置
which命令的参数:
-a:将所有由PATH目录中可以找到的命令均列出来,而不是只列出第一个被找到的命令。
which命令的格式: which [-a] command
which示例:
[root@176-140-17-46 ~]# which ifconfig
/sbin/ifconfig
[root@176-140-17-46 ~]#
三,whereis:程序名搜索:
whereis命令的格式:
whereis [-bmsu] 文件或目录名
whereis命令的参数:
-b 只查找二进制格式的文件
-m 只查找在说明文件manual路径下的文件
-s 只招source源文件
-u 查找不在上述三个选项当中的其他特殊文件
whereis 示例:
[root@176-140-17-46 ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@176-140-17-46 ~]# whereis -m ifconfig
ifconfig: /usr/share/man/man8/ifconfig.8.gz
[root@176-140-17-46 ~]#
四,locate:利用数据库查找文件
locate 不是Linux自带的命令,如果没有改命令需要yum 安装
安装:yum  -y install mlocate
安装完使用locate定位内容,如果还报如下错:原因是安装完后没有更新库
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
解决办法:
更新库:updatedb
locate命令的格式:
locate [-ir] keyword
locate命令的参数:
-b, --basename         只匹配路径名的基名
-c, --count            只输出找到的数量
-d, --database DBPATH  使用DBPATH指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
-e, --existing         只打印当前文件的条目
-L, --follow           检查文件是否存在时,跟踪符号链接(默认)
-h, --help             显示帮助
-i, --ignore-case      忽略大小写
-l, --limit, -n LIMIT  限制输出(或计数)以限制条目
-m, --mmap             忽略,为了向后兼容
-P, --nofollow, -H     检查文件是否存在时,不要跟踪符号链接
-0, --null             在输出上有NUL的单独条目
-S, --statistics       不要搜索条目,打印关于每个数据库的统计信息
-q, --quiet            安静模式,不会显示任何错误讯息
-r, --regexp REGEXP    使用基本正则表达式
--regex            使用扩展正则表达式
-s, --stdio            忽略,为了向后兼容
-V, --version          显示版本信息
-w, --wholename        匹配整个路径名(默认)
locate示例:
[root@www ~] # locate passwd
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
五,type:显示指定命令的类型
type命令格式:
type [option] [commond]
type命令的参数有:
-t:输出“file”、“alias”或者“builtin”,分别表示给定的指令为“外部指令”、“命令别名”或者“内部指令”;
-p:如果给出的指令为外部指令,则显示其绝对路径;
-a:在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名。
命令的类型可能有如下几种:
alias: 别名;
keyword: 关键字,Shell保留字;
function: 函数,Shell函数;
builtin: 内建命令,Shell内建命令;
file: 文件,磁盘文件,外部命令;
unfound: 没有找到。
type示例:
[root@176-140-17-46 ~]# type date
date is /bin/date
[root@176-140-17-46 ~]# type mysql
mysql is /usr/bin/mysql
[root@176-140-17-46 ~]# type nginx
nginx is /usr/sbin/nginx
[root@176-140-17-46 ~]# type if
if is a shell keyword
[root@176-140-17-46 ~]#

本文由 CentOS中文站 - 专注Linux技术 作者:centos 发表,其版权均为 CentOS中文站 - 专注Linux技术 所有,文章内容系作者个人观点,不代表 CentOS中文站 - 专注Linux技术 对观点赞同或支持。如需转载,请注明文章来源。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注