本文摘录自 Linux 命令行
一个 Linux 系统中包含很多文件,我们要怎么准确地查找到自己想要的文件呢?
locate mysql | grep local:会查找路径中含有 mysql 和 local 的路径。find ~ | wc -l:因为数量很多,遂将输出列表管道到其他的程序中,wc 程序用来计算出文件的数量。find 可以通过应用选项,测试条件和操作来找到符合特定标准的文件。
测试条件:如我们想在我们的搜索中得到目录列表,可以添加如下测试条件:find ~ -type d | wc -l:-type d 限制了只搜索目录,相对的,我们也可以限制只搜索普通文件:find ~ -type f | wc -l,下面是 find 命令常见的文件类型测试条件:
| 文件类型 type | 描述 |
|---|---|
| b | 块特殊设备文件 |
| c | 字符特殊设备文件 |
| d | 目录 |
| f | 普通文件 |
| l | 符号链接 |
我们也可以通过加入一些额外的测试条件,根据文件大小和文件名来搜索,让我们查找所有文件名匹配通配符模式:“*.JPG”和大于1M的普通文件:find ~ -type f -name "*.JPG" -size +1M | wc -l:+号表示大于,-号小于,没有则精准匹配。
操作符:即使拥有了 find 提供的所有测试条件,我们也需要一个可以描述将多个条件组合起来的逻辑关系。如:我们需要确定是否一个目录中所有文件和子目录拥有安全权限,怎么办呢?我们可以查看权限不是 0600 和 0700 的目录。命令是这样的find /Users/chappyzhao/Downloads/pictures/Pics/ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \):-perm 匹配权限已经设置为指定的文件或目录。
( expression 1 ) -or ( expression 2 ),这看起来没问题,因为我们正在搜索具有不同权限集合的文件和目录。圆括号对于 shell 有特殊含义,所以加了 \ 来转译防止 shell 解释它们。| 操作 | 描述 |
|---|---|
| -delete | 删除当前匹配的文件 |
| -ls | 对匹配的文件执行等同的 ls -dils 命令 |
| 把匹配文件的全路径名输送到标准输出 | |
| -quit | 一旦找到一个匹配,退出 |
find /Users/chappyzhao/Downloads/pictures/Pics/ -type f -name '*.txt' -delete:此目录以及子目录找到以 .txt 结尾的普通文件并删除。删除命令都应该小心,每次都应当先用 -print 替代 - delete 确认后再删除。
-exec command {} ;,command 就是一个命令的名字,{} 代表当前路径名,分号是必须的分隔符。比如之前的 -delete 命令就可以这样:-exec rm '{}' ';'。% mkdir -p Pics/dir-{00{1..9},0{10..99},100}
# 在新创建的目录中创建文件
% touch Pics/dir-{00{1..9},0{10..99},100}/file-{A..Z}
# 找到所有 file-A 文件,将会显示 100 个但是是乱序
% find Pics -type f -name 'file-A'
# 使用 wc -l 可以显示总数
% find Pics -type f -name 'file-A' | wc -l
# 新建
% touch Pics/timestamp
# 因为每次 touch 文件都会更新文件时间,所以在这里 touch 所有 B 文件来更改它的操作时间
% find Pics -type f -name 'file-B' -exec touch '{}' ';'
# 将所有 B 文件与 timestamp 文件比较,找出所有更新的文件
% find Pics -type f -newer Pics/timestamp
#
% find Pics \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \) | wc -l
# 给不符合权限的文件和目录赋予新权限
% find Pics \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \)
-or \( -type d -not -perm 0711 -exec chmod 0700 '{}' ';' \)