1. find
find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。
find的使用格式如下:
$ find <指定目录> <指定条件> <指定动作>
- <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
- <指定条件>: 所要搜索的文件的特征。
- <指定动作>: 对搜索结果进行特定的处理。
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
find的使用实例:
$ find . -name 'my*'
搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
$ find . -name 'my*' -ls
搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
$ find . -type f -mmin -10
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。
2. which
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which命令的使用实例:
$ which grep
find ./ -name “*.txt” | xargs rm (删除当前目录下所有以txt结尾的文件) find /home -size +512k 查大于512k的文件 find /home -size -512k 查小于512k的文件 find /home -links +2 查硬连接数大于2的文件或目录 find /home -perm 0700 查权限为700的文件或目录 find / -amin -10 # 查找在系统中最后10分钟访问的文件 find / -atime -2 # 查找在系统中最后48小时访问的文件 find / -empty # 查找在系统中为空的文件或者文件夹 find / -group cat # 查找在系统中属于 groupcat的文件 find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件 find / -mtime -1 #查找在系统中最后24小时里修改过的文件 find / -nouser #查找在系统中属于作废用户的文件 find / -user fred #查找在系统中属于FRED这个用户的文件
3. 有如下结构的示例目录 directory
$ tree directory directory ├── file1 ├── file2 ├── sub-dir1 │ ├── file1 │ ├── file2 │ └── file3 └── sub-dir2 ├── file2 └── sub-subdir1 └── file1 3 directories, 7 files
- 默认的 find 命令会列出该目录下的所有文件
$ find directory directory directory/sub-dir1 directory/sub-dir1/file3 directory/sub-dir1/file2 directory/sub-dir1/file1 directory/file2 directory/sub-dir2 directory/sub-dir2/file2 directory/sub-dir2/sub-subdir1 directory/sub-dir2/sub-subdir1/file1 directory/file1
- 为 find 命令指定 expression 以筛选出特定的文件
$ find directory -name file2 directory/sub-dir1/file2 directory/file2 directory/sub-dir2/file2
- 为 find 命令指定特殊的 action(此处
-delete
表示删除搜索结果)
$ find directory -name file2 -delete $ find directory directory directory/sub-dir1 directory/sub-dir1/file3 directory/sub-dir1/file1 directory/sub-dir2 directory/sub-dir2/sub-subdir1 directory/sub-dir2/sub-subdir1/file1 directory/file1
二、搜索条件(expression)
1. 根据文件名检索
find 命令中的 -name
选项可以根据文件名称进行检索(区分大小写)。如需要忽略文件名中的大小写,可以使用 -iname
选项。
-name
和 -iname
两个选项都支持 wildcards 。如:
?
可以表示任意一个单一的符号*
可以表示任意数量(包括 0)的未知符号
find /usr -name '*.txt' 查找 /usr 目录下所有文件名以 .txt
结尾的文件
find /usr -name '????' 查找 /usr 目录下所有文件名刚好为 4 个字符的文件
有些时候,你需要在搜索时匹配某个文件或目录的完整路径,而不仅仅是匹配文件名。可以使用 -path
或 -ipath
选项。
如查找 /usr 下所有文件名以 .txt
结尾的文件或目录,且该文件的父目录必须是 src
。可以使用以下命令:
find /usr -path '*/src/*.txt'
2. 根据文件类型检索
如果只想搜索得到文件或目录,即不想它们同时出现在结果中。可以使用 -type
选项指定文件类型。
-type
选项最常用的参数如下:
- f: 文件
- d: 目录
- l: 符号链接
find /usr -type d -name 'python*' 检索 /usr 下所有文件名以 python
开头的目录
3. 检索空文件
find 命令支持 -empty
选项用来检索为空的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录。
find ~ -type d -empty 检索用户主目录下所有的空目录
4. 反义匹配
find 命令也允许用户对当前的匹配条件进行“反义”(类似于逻辑非操作)。
如需要检索 /usr 下所有文件名不以 .txt
为后缀的文件。可以使用以下命令:
find /usr -type f ! -name '*.txt'
也可以“翻转”任何其他的筛选条件,如:
find /usr -type f ! -empty 检索 /usr 下所有内容不为空的文件
5. 根据文件的所属权检索
为了检索归属于特定用户的文件或目录,可以使用 -user
选项。
find / -type f -user starky 检索根目录下所有属主为 starky 的文件
类似于 -user
选项,-group
选项则可以根据文件或目录的属组进行检索。
7. 根据文件大小检索
-size
选项允许用户通过文件大小进行搜索(只适用于文件,目录没有大小……)。
表示文件大小的单位由以下字符组成:
c
:字节k
:KbM
:MbG
:Gb
另外,还可以使用 +
或 -
符号表示大于或小于当前条件。
find / -size +1G 检索文件大小高于 1 GB 的文件
三、对搜索结果执行命令
1. 删除文件
-delete
选项可以用来删除搜索到的文件和目录。
如删除 home 目录下所有的空目录:
find ~ -type d -empty -delete
2. 执行自定义命令
-exec
选项可以对搜索到的结果执行特定的命令。
如需要将 home 目录下所有的 MP3 音频文件复制到移动存储设备(假设路径是 /media/MyDrive
),可使用下面的命令:
find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
其中的大括号({}
)作为检索到的文件的 占位符 ,而分号( ;
)作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。
每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {}
,然后执行 -exec
后面的命令一次。
另一个很重要的用法是,在多个文件中检索某个指定的字符串。
如在用户主目录下的所有文件中检索字符串 hello
,可以使用如下命令:
find ~ -type f -exec grep -l hello {} ';'
-exec 选项中的 + 符号
创建 Gzip 格式的压缩文件的命令为: tar -czvf filename.tar.gz <list of files>
现在假设需要将用户主目录下所有的 MP3 文件添加到压缩包 music.tar.gz
中,直观的感觉是,其命令应为如下形式:
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
实际情况是,这样得到的 music.tar.gz
其实只包含一个 MP3 文件。
原因是 find 命令每次发现一个音频文件,都会再执行一次 -exec
选项后面的压缩命令。导致先前生成的压缩包被覆盖。
可以先让 find 命令检索出所有符合条件的音频文件,再将得到的文件列表传递给后面的压缩命令。完整的命令如下:
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
显示文件信息
如果想浏览搜索到的文件(目录)的详细信息(如权限和大小等),可以直接使用 -ls
选项。
find / -type file -size +1G -ls 浏览所有 1G 以上大小的文件的详细信息
四、常用参数汇总
参数 | 解析 |
---|---|
-atime n[smhdw] | 距离文件上次被访问时的时间间隔 |
-ctime n[smhdw] | 距离文件创建时的时间间隔 |
-delete | 删除检索到的文件 |
-depth n | 检索深度为 n 的文件,即位于指定目录以下 n 层的文件 |
-empty | 检索空文件或空目录 |
-fstype type | 指定文件所在的文件系统的类型 |
-group gname | 指定文件的属组 |
-iname pattern | 同 -name ,忽略大小写 |
-ipath pattern | 同 -path ,忽略大小写 |
-ls | 打印搜索到的文件的详细信息 |
-maxdepth n | 指定递归的最大层数为 n |
-mtime n[smhdw] | 距离文件上次发生变更时的时间间隔 |
-name pattern | 搜索时使用 pattern 对文件名进行匹配 |
-path pattern | 搜索时使用 pattern 对文件路径进行匹配 |
-perm mode | 根据文件权限搜索 |
-size n[ckMGTP] | 根据文件大小搜索 |
-type t | 根据文件类型搜索 |
-user uname | 指定文件的属主 |