find命令用于在指定目录中查找文件,命令格式为:
find [指定查找目录] [查找规则] [查找后执行的动作]
find pathname [选项] [-print] [-exec -ok command] {} \;
主要的参数是:
参数 | 说明 |
---|---|
pathname | 所查找的文件路径;用点.来表示当前目录,用/来表示系统根目录 |
将匹配的文件输出到标准输出 | |
-exec | find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为command{} ;注意{}和\;之间的空格 |
-ok | 和-exec类似,只是在操作之前会询问用户 |
主要的选项说明:
选项 | 说明 |
---|---|
-name | -name filename:按照名字来查找 |
-perm | 按照执行权限来查找 |
-user | -user username:按照文件属性来查找 |
-group groupname | -group groupname:按照所属组来查找 |
-mtime -n、+n | -n、+n:按照文件更改时间,-n表示n天之内,+n指的是n天以前 |
-atime | 按照访问时间来查 |
-ctime | 按照创建时间来查;-n、+n:-n指的是n天之内,+n指的是n天以前 |
-newer f1 !f2 | 查找更改时间比f1新,但是比f2旧的文件 |
-size n[c] | 查找长度是n块(n个字节)的文件 |
-type b/d/c/p/l/f | 查找块设备、目录、字符设备、管道、符号链接、普通文件 |
find . # 列出当前目录及子目录下的全部文件及文件夹
find /root -name "*.txt" # 查找root目录下以txt结尾的文件
find /root -iname "*.txt" # 同上,但是忽略大小写
find . -name dog* -o -name cat* # 当前目录下查找以dog或者cat开始的文件
# find . \( -name dog* -o -name cat* \)
find /home ! -name "*.md" # 找出home目录下不是以md结尾的文件
find . -type [fldcbs] # [类型参数: f普通文件 l符号链接 d目录 c字符设备 b块设备 s套接字]
find -name hello* # 查找hello开头的文件
find -name hello* fprint file # 在当前目录下查找hello开头的文件,并输出到file文件中
find . -type f -exec ls -l {} \; # 查找当前目录下的所有普通文件
find . -type f -name ".md" -delete # 找出md结尾的全部文件,并进行删除
find /root -path "*local*"
find . -name "*.md" # 查找以md结尾的文件
find . -iname "*.md" # 不区分大小写
注意通配符的使用:
find . -name "hello?" # 匹配任意单个字符
find . -name "[ab].sh" # 匹配括号里面的一个字符
find . -name "*hello*" # 匹配任意一个或多个字符
find . -maxdepth 3 -type f # 向下最大搜索限制为3
find . -mindepth 2 -type f # 搜索距离当前目录至少两个目录的所有文件
find . -uid 700 # 查找uid是700的文件
find . gid 1000 # 查找gid是1000的文件
Linux文件系统文件中每个文件都有3种时间戳:
使用stat命令来查看一个文件的时间信息:
stat /etc/passwd
通过时间查找文件的例子:
find . -type f -atime -7 # 搜索最近7天被访问过的文件
find . -type f -atime 7 # 搜索恰好在7天前被访问的所有文件
find . -type f -atime +7 # 搜索超过7天被访问的文件
find . -type f -amin +10 # 超过10分钟访问的文件
find . -type f -newer hello.txt # 找出比hello.txt修改时间更长的所有文件
Linux系统中文件大小单元:
符号 | 大小 |
---|---|
b | 块,512字节 |
c | 字节 |
w | 字(2个字节) |
k | 千字节 |
M | 兆字节 |
G | 吉字节 |
find . -type f -size +10k # type指定类型为f(文件),大于10k
find . -type f -size 10k # type指定类型为f(文件),刚好为10k
find . -type f -size -10k # type指定类型为f(文件),小于10k
find . -empty # 列出长度为0的文件
根据3种逻辑判断条件来进行查找:
与:-a
或:-o
非:-not, !
find . -name "*.md" -a -user root # and
find /tmp -not -user root # tmp目录下,用户不是root
Linux中文件具有3种权限:读、写、可执行
权限 | 对文件的影响 | 对目录的影响 | 对应大小 |
---|---|---|---|
r(读取) | 可读取文件内容 | 可列出目录内容 | 4 |
w(写入) | 可修改文件内容 | 可在目录中创建删除内容 | 2 |
x(执行) | 可作为命令执行 | 可访问目录内容 | 1 |
目录必须拥有 x 权限,否则无法查看其内容
Linux中的权限分配给3种用户:user、group、other
每个文件的权限基于UGO进行设置;权限三位一组(rwx),同时需授权给三种角色(UGO);
每个文件拥有一个所属用户和所属组,对应UGO,不属于该文件所属用户或所属组使用O来表示。
drwxr-xr-x 5 peter staff 160 3 5 2020 good-good-study
解释上面目录属性:
-
则表示为普通文件理解了上面Linux中用户(组)及用户权限的问题,可以查找相关的文件:
find . -type f -perm 777 # 查找权限为777 的文件
find . -type f -name ".md" ! -perm 644 # 查找当前目录下全部不是644的md文件
find . -type f -user peter # 查找peter拥有的全部文件
find . -type f -group staff # 查找用户组staff的全部文件
ind命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和\;之间的空格。
find
命令查找出结果-exec
和{} \;
进行结果的输出find . -type f -exec ls -l {} \; # 前面是找出文件,后面是输出文件到终端()
find ./ -mtime -1 -type f -exec ls -l {} \; # 查找当前修改过的文件(不会询问)
find ./ -mtime -1 -type f -ok ls -l {} \; # ok会询问是否输出
总结:
-exec
:直接执行动作,不会询问-ok
:执行动作之前先询问locate 可以很快速的搜寻档案系统内是否有指定的档案。locate 因为是只去检索索引数据库,所以在比 find 全盘检索要快很多。
locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快
locate命令是查不到最近的数据,如果想查询需要先更新数据库:
updatedb # 更新数据库
locate命令的一般格式为:
locate [option] [pattern]
选项 | 说明 |
---|---|
-A, --all | 只显示匹配所有模式的条目 |
-b, --basename | 只匹配路径名的基本名称 |
-c, --count | 只显示找到的条目的数目 |
-d, --database DBPATH | 使用 DBPATH,而非默认数据(即:/var/lib/mlocate/mlocate.db) |
-e, --existing | 只显示当前存在的文件条目 |
-L, --follow | 当文件存在时跟随蔓延的符号链接(默认) |
-h, --help | 显示帮助信息 |
-i, --ignore-case | 忽略大小写区别 |
-l, --limit, -n LIMIT | 限制为 LIMIT项目的输出(或 计数) |
-m, --mmap | 被忽略,用于向后兼容 |
-P, --nofollow, -H | 当检查文件时不跟随蔓延的符号链接 |
-0, --null | 输出时以 NUL 分隔项目 |
-S, --statistics | 不搜索项目,显示有关每个已用数据库的统计信息 |
-q, --quiet | 不报告关于读取数据库的错误消息 |
-r, --regexp REGEXP | 搜索基本正则表达式 REGEXP 而不是模式 |
--regex | 模式是扩展正则表达式 |
-s, --stdio | 被忽略,用于向后兼容 |
-V, --version | 显示版本信息 |
-w, --wholename | 匹配完整路径名(默认) |
$ locate /home/hello # 指定目录下查找hello开头的文件
$ locate hello # 查询hello开头的文件
$ locate -n 10 python # 限制输出10条和python相关的条目
$ locate -i -n 5 passwd # 不区分大小写
$ locate -r ^/var/lib/rpm # 使用正则表达式:^表示开始的符号
$ locate -r zip$ # 以zip结尾的文件