[Linux基础]-3-文件查找命令
引言
这篇文章记录常用的4个和文件查找相关的Linux命令,也是Linux中最使用频率最高的几个文件查找命令。
文章目录
0×1.which命令
which会在系统的$PATH中搜索某个系统命令的位置,并仅返回第一个搜索到的结果。
which命令示例:
echo $PATH #查看系统中的环境变量目录,which会在$PATH中包含的目录中逐个查找,直到找到第一个包含命令的目录返回
which man #查找man命令所在位置
which ls #查找ls命令所在位置,因为ls是终端内置命令,所以不会有路径
0×2.whereis命令
whereis命令只搜索二进制文件(参数-b),man说明文件(参数-m)和源代码文件(参数-s),如果省略参数,则返回所有信息。
whereis命令示例:
whereis find #搜索find程序的二进制文件,说明文件以及源代码文件
whereis -b find #仅搜索find程序的二进制文件
whereis -m find #仅搜索find程序的说明文件
whereis -s find #仅搜索find程序的源代码文件
0×3.locate命令
locate同whereis一样,依赖于程序自建的数据库查询,在Archlinux中,默认没有locate这个命令,需要手动安装(sudo pacman -S locate),并且在安装之后,需要手动建立一次本地数据库(sudo updatedb),因为是基于本地数据库查询,查询到的数据不一定是最新的,想要查询最新的数据,可以使用sudo updatedb命令手动更新本地数据库后再查询,locate常用参数如下:
-l num 查询结果显示num行
-r 使用正则运算式做为寻找条件
-i 忽略大小写
locate命令示例:
sudo updatedb #查询之前,先更新系统路径数据库
locate -l 5 find #查找包含find名称的文件,仅显示查询结果的前5行
locate -r 'hack...rs' #使用正则表达式,查找hack和rs中间仅有三个字符的文件
locate -i /etc/ssh #查找/etc/下ssh开头的文件,忽略大小写
0×4.find命令
find命令可以用来遍历磁盘查找文件,也是功能最全面的一个文件查找命令,下面是find命令常用参数:
-exec 将find命令的查询结果一条条传输给-exec后面的命令执行。格式为"-exec 命令 {} \;",{}是一个占位符号,代表find查找出来的每一条结果逐个代入这个位置执行,注意{}和\;之间的空格。
-ok 和-exec的作用相同,但ok执行需要用户确认。
-depth 在查找文件时,会优先查找当前目录中的文件,然后再去其子目录中查找。
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的修改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime(访问时间)和-ctime(创建时间)选项,它们都和-mtime选项相似。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
s - socket文件
-size n[cwbkMG] : 文件大小 为 n 个由后缀决定的数据块。其中后缀为:
b: 代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b)
c: 表示字节数
k: 表示 kilo bytes (1024字节)
w: 字 (2字节)
M:兆字节(1048576字节)
G: 千兆字节 (1073741824字节)
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-delete (删除)
-maxdepth 查找最大目录层数 如 1,即只查找一层目录
-iname 按名称搜索无论大小写
-mount 在查找文件时不跨越文件系统mount点。
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思
find命令示例:
find . -name '*.rs' #按名字来查找,查找当前目录中所有.rs结尾的文件
find /etc/ssh -name 'sshd_config' #查找/etc/ssh目录中名字叫做sshd_config的文件
find . -name '[0-9]*.rs' #查找当前目录中以数字0到9开头的并且后缀是.rs的文件
find . -perm 777 #查找当前目录下权限是777的文件
find . -perm 777 -name '*.rs' #查找当前目录下权限是777并且后缀是.rs的文件
find . -not \( -name '*.sample' -o -name '*.rs' \) #查找当前目录下不以.sample或.rs结尾的文件,两个括号用\转义
find . -name 'hk*' -type f #查找当前目录下以hk开头的普通文件
find . -not -type d #查找当前目录中非目录文件
find . ! -type d #同上!符号等同于-not
find . -nouser #查找当前目录下无用户名的文件,系统允许存在有uid但无用户名的文件,就属于这一类的查询结果
find . -user 19999 -group 9999 #查找当前目录下用户名是19999,组是9999的文件
find . -size +100M #查找当前目录下大于100M的文件
find . -size +100M -exec du -sh {} \; #查找当前目录下大于100M的文件,并用du -sh命令来分别显示他们的大小
find . -depth -mtime -3 -ok rm -r {} \; #查找当前目录下修改时间3天内的文件,并且用rm命令删除他们,删除时候提示,如果用户输入y回车就会被删除
find . -depth -mtime +3 -ok rm -r {} \; #+3代表三天之前,-3代表三天之内,其他同上
find . -name 'hackmm' -delete #查找当前目录下叫做hackmm的文件,找到之后直接删除
find . -iname 'HK2' # 不区分大小写,查找当前目录下叫做HK2的文件,意味着hk2,Hk2,HK2,hK2都会被匹配到
find . -maxdepth 3 -name '*.rs' #查找当前目录下,名字以.rs结尾的文件,但只递归查找3层子目录