在 利用命令行工具(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.log、 accEss.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 按修改时间寻找文件 寻找最新创建的文件 $ ls -Atr | tail -1 寻找过去7天内修改过的文件 $ find . -mtime -7 准确的说,是过去 7x24 小时内修改过的文件 参照其他文件的修改时间 寻找比某文件(比如 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 下还可以使用如下批处理程序,实现搜索文件的目的: 批量搜索并复制/剪切文件的批处理程序 按关键字检测文件(夹)是否存在的批处理程序 搜索空文件夹的批处理程序