主页

索引

模块索引

搜索页面

find命令使用

find [路径] <表达式>
  • 查找文件:

    -name <表达式> 根据文件名查找文件
    -perm mode,[-mode],[/mode],[+mode]
    -printf <format>
    -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> 按 UID 查找文件
    -group <群组名> 按归属群组查找文件
    -gid <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 {} \;

主页

索引

模块索引

搜索页面