利用命令行工具(1) 寻找文件

发表时间

利用命令行工具(0) 处理日志 一文中,一系列介绍命令行处理文件的文章,本文用于查找符合特定条件的文件。

目录

本文介绍的命令适用 Linux 系统,在 Mac 系统下有些不同,甚至可能无法使用

按文件名搜索

寻找目录

只列出目录,而不显示文件

$ ls -d */

如果 用 ls -d . ,只能显示当前目录本身,而不能显示当前目录内容

寻找隐藏文件

列出当前目录下的隐藏文件,即以 . 开头的文件和文件夹

$ ls -d .*

上面这种写法会将当前目录( . )和上层目录( .. )一并显示出来,下面的写法可以将这两项排除:

$ ls -d .[!.]*

寻找所有的隐藏文件

$ find -type f -name ".*"
按文件名寻找文件

当前目录下,按照文件名关键字(比如 access.log)寻找文件,并打印出文件路径和名称

$ find . -name "access.log" -print

这里搜索起始位置 . 和搜索后动作 -print 都是缺省值,可以不提供,简化为:

$ find -name "access.log"
按文件名寻找文件夹

当前目录下,寻找名称中包含关键字的文件夹,使用 -type

$ find -type d -name "log"
忽略大小写

按文件名寻找文件,忽略大小写,使用 -iname 参数

$ find -iname "access.log"

类似 Access.logaccEss.log 都会被搜索出来

按文件属性搜索

寻找软链接(符号链接)
$ find -type l
寻找 777 属性的文件
$ find -type f -perm 777
寻找当前目录下 777 属性的文件夹

仅在当前目录下寻找,而不继续搜索子文件夹

$ find -maxdepth 1 -type d -perm 777
寻找只读文件
$ find -perm 0644
按文件属主搜索
$ find -user zhangsan

寻找所有属于 zhangsan 的文件

按文件大小搜索

寻找空文件

寻找空文件,包括所有子文件夹

$ find . -empty 
仅在当前目录下寻找空文件

仅在当前层级目录下寻找,不进入子目录中

$ find . -maxdepth 1 -empty 
寻找指定大小的文件

记得有个文件是 3.4MB 大小,不记得放哪里了,用 find 找出来:

$ find . -size 4M

-size 不接收浮点型数值,需要预先向上取整。

寻找大文件

磁盘快满了,需要在整个文件系统中寻找超大文件的位置。首先查看哪个目录比较大

$ du -h -d 1

再在目录里寻找超过 1G 的文件

$ find . -size +1G 

找到后,列出文件详细信息,并按大小降序排列

$ find . -size +1G -print0 | xargs -0 ls -hlS

其他可以用的单位:

字节:c
512字节块:b(不写单位时的默认单位)
双字节:w(适合搜中文)
kB:k
MB:M
GB:G

按修改时间寻找文件

寻找过去7天内修改过的文件
$ find . -mtime -7

准确的说,是过去 7×24 小时内修改过的文件

参照其他文件的修改时间

寻找比某文件(比如 access.log)更晚修改过的文件,

$ find . -newer "access.log"

寻找最近24小时内被修改过的文件

$ find . -mtime 0 

取反逻辑

寻找扩展名不是 .gz 的文件:

$ find . -not -name "*.gz"

寻找非空的文件:

$ find . -not -empty -name "*.log"

上面的命令里, -not 可以简化为叹号 !

find 命令的用法总结

find 命令的基本格式为:

$ find 参数 起始搜索位置 表达式 

其中:
参数 规定了find 命令的行为,比如搜索时如何处理软链接,是否使用优化算法等参数
起始搜索位置 规定了搜索的起始位置,也就是搜索的顶层目录。
表达式 规定了满足什么条件的文件可以被筛选出来(Tests),和筛选后的进一步操作(Actions):

Windows 批处理文件

另外,除了这些 Linux 的命令行以外,在 Windows 下还可以使用如下批处理程序,实现搜索文件的目的:


相关文章

除非特别说明,本站文章均系原创,并采用 署名协议 CC-BY 授权。
欢迎转载,惟请保留原文链接:https://lfhacks.com/tech/log-toolkit-find-file