简介
说明
本文介绍Linux的grep命令的用法。
find命令简介
find命令用于搜索文件中的内容(字符串)。
find支持 glob匹配模式。不支持正则表达式
which, whereis, locate, find的区别
命令 | 查找范围 | 查找的文件类型 | 速度 | 备注 |
which | $PATH路径 | 可执行文件 | 快 | 默认只返回第一个匹配的文件路径。通过选项 -a 可以返回所有结果。 |
whereis | $PATH 其他几个特定系统目录 | 二进制(命令)、源文件、man文件 | 快 | |
locate | 文件的索引数据库 | 所有 | 快 | 新建的文件需要时间才能加入该索引数据库。可通过updatedb命令强制更新索引,确保不会遗漏文件。该命令通常会返回大量匹配项,可使用 -r 选项通过正则表达式来精确匹配。 |
find | 所有文件 | 所有 | 慢 |
示例
基本用法
命令 | 作用 |
find -name "*fb*" | 查找当前目录文件名有fb的文件(默认递归) |
find /tmp /usr -name \*.log | 多个目录去找 |
find ./ -iname \*.txt | 大小写都匹配 |
根据类型查找
命令 | 作用 |
find ./ -type d | 当前目录下的所有子目录 |
find ./ -type d -name “sys” | 在当前目录下搜索有文件名带有sys的路径 |
find /usr -type l | /usr下所有的符号链接 |
find /usr -type l -name "z*" -ls | 符号链接的详细信息 eg:inode,目录 |
按文件条件查找
命令 | 作用 |
find /home/admin -size +250000k | 超过250000k的文件,当然+改成-就是小于了 |
find /home/admin f -perm 777 -exec ls -l {} \; | 按照权限查询文件 |
find /home/admin -atime -1 | 1天内访问过的文件 |
find /home/admin -ctime -1 | 1天内状态改变过的文件 |
find /home/admin -mtime -1 | 1天内修改过的文件 |
find /home/admin -amin -1 | 1分钟内访问过的文件 |
find /home/admin -cmin -1 | 1分钟内状态改变过的文件 |
find /home/admin -mmin -1 | 1分钟内修改过的文件 |
格式
find path -option [ -print ] [ -exec -ok command ] {} \;
path: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-option:选项。见下边
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。
相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
选项
选项 | 含义 |
-mount, -xdev | 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件 |
-[a/m/c]min [-]n | 在n分钟前/内 被a/m/c过的文件。可以用+-表示大于此时间或小于此时间。 a:access //访问(读取) m:modification //修改(文件内容被修改) c:change //变更(内容被修改,或权限等 metadata 被修改) 例: -mmin 2 两分钟前被修改过 等价于 -mmin +2 -mmin -2 两分钟内被修改过 |
-[a/m/c]newer file | 比文件 file 更晚被 读取/修改/变更 过的文件。 |
-[a/m/c]time [-]n | 在n天前/内 被 读取/修改/变更 过的文件。 |
-empty | 空的文件 |
-gid n或 -group name | gid 是 n 或是 group 名称是 name |
-ipath pattern, -path pattern | 路径名称符合pattern的文件,ipath 会忽略大小写。 支持通配符。 |
-name pattern, -iname pattern | 文件名称符合 pattern的文件。iname 会忽略大小写。 支持正则表达式。 |
-size [+-]n[b/c/k/M/G] | 文件大小是n单位。b代表 512 位元组的区块,c表示字节数,k表示 kB,M表示MB,G表示GB,w是两个字节。 可以用+-表示比这个大小大或者小。 例如:find / -size +1G 检索文件大小高于 1 GB 的文件 |
-type | b 块设备文件 c 字符设备文件 d 目录文件 //-d可能会被废弃。 改用-depth p 命名管道(FIFO) f 普通文件 l 符号链接文件(symbolic links) s socket文件 |
-depth | 在进入子目录前先行查找完本目录。 |
-perm | 以文件权限为依据进行搜索。 例1:检索 /usr 目录下权限为 rwxr-xr-x 的文件: find /usr -perm u=rwx,g=rx,o=rx 例2:只要求文件有执行权限,不管其读写权限是什么。 find / -type f -perm /a=x 其中 a=x 前面的 / 符号即用来表示只匹配权限的某个子集(执行权限),而不用关心其他权限的具体设置。 备注:-perm 选项也支持数字形式的文件权限标记。 find /usr -perm 644 搜索 /usr 目录下权限为 644(即 rwxr-xr-x)的文件 |
-prune | 忽略某个目录 如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。 例1:在/usr/sam目录下查找不在dir1子目录之内的所有文件 find /usr/sam -path "/usr/sam/dir1" -prune -o -print -path "/usr/sam" -prune -o -print 等价于 -path "/usr/sam" -a -prune -o -print。 例2:避开多个文件夹 find /usr/sam ( -path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -print 圆括号表示表达式的结合:表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。 例3:在/usr/sam路径下,但排除/usr/sam/dir1和/usr/sam/dir2,查找tmp文件 find /usr/sam (-path /usr/sam/dir1 -o -path /usr/sam/file1 ) -prune -o -name "tmp" -print 注意:-name等选项加在-o 之后 |
-maxdepth | 限制 find 命令递归的层数。 find / -maxdepth 3 搜索时向下递归的层数最大为 3 |
-delete | 删除搜索到的文件和目录。 例:删除 home 目录下所有的空目录: find ~ -type d -empty -delete |
-user, -nouser | 按文件属主查找文件 例1:在/etc目录下查找文件属主为uucp的文件: $ find /etc -user uucp -print 例2:在/home目录下查找属主在/etc/passwd文件中没有有效帐户的文件 $ find /home -nouser -print 备注:查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。 |
-group, -nogroup | 和-user类似 |
-fstype type | 指定文件所在的文件系统的类型 |
-ls | 显示文件信息 如果想浏览搜索到的文件(目录)的详细信息(如权限和大小等),可以直接使用 -ls 选项。 例:find / -type file -size +1G -ls 浏览所有 1G 以上大小的文件的详细信息 |
-exec | |
解析 | 对搜索到的结果执行特定的命令。 例1:将 home 目录下所有的 MP3 音频文件复制到移动存储设备(假设路径是 /media/MyDrive),可使用下面的命令: find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';' 其中的大括号({})作为检索到的文件的占位符 ,而分号( ;)作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。 每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {},然后执行 -exec 后面的命令一次。 例2:在用户主目录下的所有文件中检索字符串 hello ,可以使用如下命令: find ~ -type f -exec grep -l hello {} ';' |
+ | 执行完find命令之后,再执行-exec。 例:将用户主目录下所有的 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 {} + |
其他操作 | |
! | 对当前的匹配条件进行“反义”(类似于逻辑非操作)。 例1:检索 /usr 下所有文件名不以 .txt 为后缀的文件 find /usr -type f ! -name '*.txt' 例2:检索/usr下所有不为空的文件 find /usr -type f ! -empty |
-[a/o] | 表示与(and)和或(or)。 例1: /usr 下文件名以 python 开头且类型为目录的文件 find /usr -type d -name 'python*' 等同于:find /usr -type d -a -name 'python*' 例2:find / '(' -mmin -5 -o -mtime +50 ')' -a -type f 备注:可以使用小括号对搜索条件进行分组。注意 find 命令中的小括号常需要用单引号包裹起来。因小括号在 Shell 中有特殊的含义。 |
-exec
对搜索到的结果执行特定的命令。
例1:将 home 目录下所有的 MP3 音频文件复制到移动存储设备
(假设路径是 /media/MyDrive),可使用下面的命令:
find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
其中的大括号({})作为检索到的文件的占位符 ,而分号( ;)作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。
每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {},然后执行 -exec 后面的命令一次。
例2:在用户主目录下的所有文件中检索字符串 hello
可以使用如下命令:
find ~ -type f -exec grep -l hello {} ';'
+
执行完find命令之后,再执行-exec。
例:将用户主目录下所有的 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 {}