.. _find: find命令使用 ############ :: find [路径] <表达式> * 查找文件:: -name <表达式> 根据文件名查找文件 -perm mode,[-mode],[/mode],[+mode] -printf -iname <表达式> 根据文件名查找文件,忽略大小写 -path <表达式> 根据路径查找文件 -ipath <表达式> 根据路径查找文件,忽略大小写 -amin <分钟> 过去 N 分钟内访问过的文件 -atime <天数> 过去 N 天内访问过的文件 -cmin <分钟> 过去 N 分钟内修改过的文件 -ctime <天数> 过去 N 天内修改过的文件 -anewer <参照文件> 比参照文件更晚被读取过的文件 -cnewer <参照文件> 比参照文件更晚被修改过的文件 -size <大小> 根据文件大小查找文件,单位 b c w k M G -type <文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件 -user <用户名> 按归属用户查找文件 -uid 按 UID 查找文件 -group <群组名> 按归属群组查找文件 -gid 按 GID 查找文件 -empty 查找空文件 -mindepth N: 最小高度 -maxdepth N: 最大高度 示例 ==== 1. 基本查找 ----------- 忽略大小写查找:: $ find . -iname text 找到指定文件(过滤文件夹):: $ find . -name abc -type f 2. 根据他们的权限查找 --------------------- 基本命令:: find . -perm 664 find . -perm -664 查找没有 777 权限的文件:: $ find . -type f ! -perm 777 三种特殊权限—suid、 sgid 和粘滞位 (sticky):: 查找具有 644 个权限的 SGID 文件: find . -type f -perm 2664 找到具有 551 权限的粘滞位文件: find . -perm 1551 按rwx查找:: //找可被ower和group写的 find . -perm -220 find . -perm -g+w,u+w 查找所有可读文件: find . -perm -u=r 查找所有可执行文件: find . -perm -u=x 空文件/目录:: 查找所有空文件: find . -type f -empty 查找所有空目录: find . -type d -empty 所有隐藏文件: find . -type f -name ".*" 其他:: 1. 注: linux下还可以用/代替- find . -perm /220 find . -perm /u+w,g+w find . -perm /u=w,g=w 3. 基于所有者和组查找 --------------------- 用户:: 在所有者 root 的 /root 目录下查找名为 test.c 的所有文件: find / -user root -name test.c 查找~目录下属于用户 gordon 的所有文件: find ~ -user gordon 组:: 查找 /home 目录下属于 Group Developer 的所有文件: find /home -group developer 4. 根据日期和时间查找 --------------------- 按天查修改的文件:: 查找最近 50 天修改的文件: $ find . -mtime -50 查找最近 50-100 天修改的文件: $ find . -mtime +50 -mtime -100 按天查访问的文件:: 查找最近 50 天访问的文件: $ find . -atime 50 按小时查文件:: 过去 1 小时内查找更改的文件: $ find . -cmin -60 最近 1 小时内查找修改的文件: $ find . -mmin -60 最近 1 小时内访问的文件 $ find . -amin -60 5. 根据大小查找 =============== 找到 50MB 的文件:: $ find . -size 50M 查找大小在 50MB 到 100MB 之间:: $ find . -size +50M -size -100M 详细选项 ======== 说明:: a The access time of the file reference B The birth time of the file reference c The inode status change time of reference m The modification time of the file reference t reference is interpreted directly as a time 使用实例: mmin, amin, cmin mtime, atime, ctime UID 是 Set User ID SGID 是 Set Group ID -type 选项:: b block (buffered) special c character (unbuffered) special d directory p named pipe (FIFO) f regular file l symbolic link; s socket D door (Solaris) :: 9 8 7 6 5 4 3 2 1 0 - r w x r - x r - x 第 9 位表示文件类型:: p: 表示命名管道文件 d: 表示目录文件 l: 表示符号连接文件 -: 表示普通文件 s: 表示 socket 文件 c: 表示字符设备文件 b: 表示块设备文件 第 8-6 位、5-3 位、2-0 位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为 rwx:: r 表示可读 w 表示可写 x 表示可执行 - 表示没有权限 SUID 与 SGID ============ SUID 与 SGID:: 1. -rwsr-xr-x 表示 SUID 和所有者权限中可执行位(即x)被设置 2. -rwSr--r-- 表示 SUID 被设置,但所有者权限中可执行位(即x)没有被设置 3. -rwxr-sr-x 表示 SGID 和同组用户权限中可执行位(即x)被设置 4. -rw-r-Sr-- 表示 SGID 被设置,但同组用户权限中可执行位(即x)没有被设置 ps: UNIX 的实现中,文件权限用 12 个二进制位表示 11 10 9 8 7 6 5 4 3 2 1 0 S G T r w x r w x r w x 第 11 位为 SUID 位,第 10 位为 SGID 位,第 9 位为 sticky 位,第 8-0 位对应于上面的三组 rwx 位 例如: 上面的 -rwsr-xr-x 的值为: 1 0 0 1 1 1 1 0 1 1 0 1 -rw-r-Sr-- 的值为: 0 1 0 1 1 0 1 0 0 1 0 0 给文件加 SUID 和 SUID 的命令如下: chmod u+s filename 设置 SUID 位 chmod u-s filename 去掉 SUID 设置 chmod g+s filename 设置 SGID 位 chmod g-s filename 去掉 SGID 设置 OPERATORS ========= 使用:: 1. ( expression ) 2. ! expression -not expression 3. -false Always false. 4. -true Always true. 5. expression -and expression expression -a expression expression expression 6. expression -or expression expression -o expression 实例:: find / -type f \( -perm -4000 -o -perm -2000 \) –print 其他 ==== * 实例:: // 找出当前目录下普通文件列表 find . -type f // 找出当前目录下文件夹列表 find . -type d //使用正则 find . -name "[a-z]*" //找出以a-z开头的文件 //可以通过下述指令查找硬链接 find / -xdev -samefile /etc/resolv.conf // 指定路径为1的文件夹列表(即当前目录下文件夹列表,不包含.和..) find . -mindepth 1 -maxdepth 1 -type d 常见问题1:: find: paths must precede expression: webfd Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] // 原因 即出现这个提示是因为星号代表为当前目录下所有的文件,然后被当做shell展开 这就是网上说的多文件的查找的时候需要增加单引号 This happens because *.c has been expanded by the shell resulting in find // 解决方法 $ find . -name '*.c' -print 或 $ find . -name \*.c -print 排除功能:: % 在当前目录中,排除子目录source/ 和 blog/ ,查找所有的rst文件 % -prune -o: 总计算为true,只展示此目录,不往此目录下继续执行 find . -path "./blog" -prune -o -path "./source" -prune -o -name *.rst % 查找文件名为非*.c的文件 find . ! -name "*.c" % find . -not -path '*.svn*' -print or find . ! -path '*.svn*' -print 过滤:: // 过滤指定文件夹 files=( $(find . -name '*.go' -not -path './vendor/*') ) // 过滤多个文件夹 find . -name '*.go' -not -path './cli/*' -not -path './internal/*' 实践 ==== 找出当前目录下更改时间在5日以前的文件并删除它们:: find . -type f -mtime +5 -exec rm {} \;