文件查找和比较命令 来自: http://man.linuxde.net/find
文件查找和比较
1、find命令,用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时不设置任何参数,则find命令则在当前目录下查找子目录与文件。并且将查到的子目录和文件全部进行显示。
find(选项)(参数)
选项
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟记;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件和目录;
-atime<24小时数>:查找在指定时间内被存取过的目录或文件,单位以24小时记;
-cmin<分钟>:查找在指定时间内被修改过的文件或目录;
-name
-iname<文本范式>忽略大小写
-type
-links
……
……
参数:起始目录:查找文件的起始目录
实例
根据文件或者正则表达式进行匹配
(1)列出当前目录及子目录下所有文件和文件夹 find .
(2)在/home目录下查找以.txt 结尾的文件名 find /home -name "*.txt"
(3)同上忽略大小写 find /home -iname "*.txt"
(4)当前目录及子目录下查找所有以.txt和 .pdf结尾的文件 find . \( -name "*.txt" -o -name "*.pdf" \) 或者 find . -name "*.txt" -o -name "*.pdf"
(5)匹配文件路径或者文件 find /usr/ -path "*local*"
(6)基于正则表达式匹配文件路径 find . -regex ".*\(\.txt\|\.pdf\)$"
(7)同上,不区分大小写 find . -iregex ".*\(\.txt\|\.pdf\)$"
否定参数
(1)找出/home下不是以.txt结尾的文件 find /home ! -name "*.txt"
根据文件类型进行搜索
find . -type 类型参数
类型参数列表
f 普通文件
| 符号连接
d 目录
c 字符设备
b 块设备
s 套接字
p Fifo
基于目录深度搜索
(1)向下最大深度限制为3
find . -maxdepth 3 -type f
(2)搜索出深度距离当前目录至少2个子目录的所有文件
find . -mindepth 2 -type f
根据文件时间戳进行搜索
find . -type f 时间戳
Unix/Linux 文件系统每个文件都有三种时间戳:
访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
(1)搜索最近七天内被访问的所有文件
find . -type f -atime -7
(2)搜索恰好在七天前被访问的所有文件
find . -type f -atime 7
(3)搜索超过七天内访问的所有文件
find . -type f -atime +7
(4)搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
(5)找出比file.log修改时间更长的所有文件
find . -type f -newer file.log
根据文件大小进行匹配
find . -type f -size 文件大小单元
文件大小单元
b -- 块(512字节)
c -- 字节
w -- 字(2字节)
k -- 千字节
M -- 兆字节
G -- 吉字节
(1)搜索大于10kb的字节
find . -type f -size +10K
(2)搜索小于10KB的字节
find . -type f -size -10K
(3)搜索等于10KB的字节
find . -type f -size 10K
删除匹配文件
删除当前目录下所有.txt文件
find . -type f -name "*.txt" -delete
根据文件权限/所有权进行匹配
(1)当前目录下搜索出权限为777的文件
find . -type f -perm 777
(2)找出当前目录下权限不是644的php文件
find . -type f -name "*.php" ! -perm 644
(3)找出当前目录用户tom拥有的所有文件
find . -type f -user tom
(4)找出当前目录用户组sunk拥有的所有文件
find . -type f -group sunk
借助 -exec选项与其他命令结合使用
(1)找出当前目录下所有root的文件,并把所有权更改为用户tom
find . -type f -user root -exec chown tom {} \;
上列中,{}用于与-exec选项配合使用来匹配所有文件,然后会被替换为相应的文件名。
(2)找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} \;
上列中,-ok与-extc行为一样,不过它会给出提示,是否执行相应的操作。
(3)找出当前目录下所有的.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
(4)将30天前的.log文件移动到old目录中
find . -type f -name "*.log" -mtime +30 -exec cp {} old \;
(5)找出当前目录下的所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
(6)因为单行命令中-exec参数中无法使用多个命令,以下方法可以在实现-exec之后接受多条命令
-exec ./text.sh {} \;
搜索但跳出指定的目录
查找当前目录或者子目录下所有的.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print
要列出所有长度为0的文件
find . -empty
2、whereis命令
whereis命令是用来定位指令的二进制程序、源程序文件和man手册页等相关文件的路径。
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。
如果省略参数,则返回所有信息。
和find相比whereis查找的速度非常快,这是因为Linux系统会将系统中的所有文件都记录在一个数据库文件中,当使用whereis
和下面介绍的locate时,会从数据库中查找数据,而不是像find那样,通过遍历磁盘来查找,效率自然高,但是数据库文件并不是
实时更新,默认情况下一周更新一次,因此,我们在使用为whereis和locate查找文件时,有时会找到已经被删除的数据,或者
刚刚建立的文件无法找到,原因就是数据库文件没有被更新。
语法
whereis(选项)(参数)
选项
-b:只查找二进制文件。
-B<目录>:只在设置的目录下查找二进制文件;
-f:不显示文件名钱的路径名称;
-m:只查找说明文件;
-M<目录>:只在设置的目录下查找说明文件;
-s:只查找原始代码文件;
-S<目录>:只在设置的目录下查找原始代码文件;
-u:查找不包含指定类型的文件。
参数
指令名:要查找的二进制程序、源文件和man手册页的指令名。
实例
将相关文件都查找出来
whereis tomcat
whereis svn 如果没有安装,则找不出来
只将二进制文件查找出来
whereis -b nginx
只将说明文件查找出来
whereis -m nginx
只将原始代码文件查找出来
whereis -s nginx
3、which命令
which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里面查找符合条件的文件。
也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
语法
which(选项)(参数)
选项
-n<文件名长度>:指定文件名长度,指定的长度必须大于等于所有文件中最长的文件名;
-p<文件名长度>:与-n参数相同,但此处包含的文件名长度包含了文件的路径;
-w:指定输出时栏位的宽度;
-V:显示版本信息;
参数
指令名:指令名列表。
实例
查找文件,显示命令路径:
which pwd
which adduser
说明:which是根据使用者所配置的PATH变量内的目录去搜索可运行档的!所以不同的PATH配置内容找到的命令当然不一样的!