7.1 文件查找
7.1.1 简介
which:命令查找 find:文件查找,针对文件名 locate:文件查找,依赖数据库
7.1.2 which
which命令用于查找文件。 which指令会在环境变量$PATH设置的目录里查找符合条件的文件。
which
命令的基本语法如下:
which [文件...]
参数说明:
-
-n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-
-p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。
-
-w 指定输出时栏位的宽度。
-
-V 显示版本信息。
例:
使用指令"which"查看指令"bash"的绝对路径,输入如下命令:
which bash/ls/mkdir/pwd/cd/touch/cp/mv/useradd
上面的指令执行后,输出信息如下所示:
/bin/bash #bash可执行程序的绝对路径
7.1.3 find
find 命令用于在指定目录下查找文件和目录。 它可以使用不同的选项来过滤和限制查找的结果。
find
命令的基本语法如下:
find [path] [expression] [option] [action]路径 表达式 动作
参数说明:
path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。
expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。
expression 中可使用的选项有二三十个之多,以下列出最常用的部份:
-
-name pattern
:按文件名查找,支持使用通配符*
和?
。 -
-type type
:按文件类型查找,可以是f
(普通文件)、d
(目录)、l
(符号链接)等。 -
-size [+-]size[cwbkMG]
:按文件大小查找,支持使用+
或-
表示大于或小于指定大小,单位可以是c
(字节)、w
(字数)、b
(块数)、k
(KB)、M
(MB)或G
(GB)。 -
-mtime days
:按修改时间查找,支持使用+
或-
表示在指定天数前或后,days 是一个整数表示天数。 -
-user username
:按文件所有者查找。 -
-group groupname
:按文件所属组查找。
find 命令中用于时间的参数如下:
-
-amin n
:查找在 n 分钟内被访问过的文件。 -
-atime n
:查找在 n*24 小时内被访问过的文件。 -
-cmin n
:查找在 n 分钟内状态发生变化的文件(例如权限)。 -
-ctime n
:查找在 n*24 小时内状态发生变化的文件(例如权限)。 -
-mmin n
:查找在 n 分钟内被修改过的文件。 -
-mtime n
:查找在 n*24 小时内被修改过的文件。
在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。
例如:-mtime 0 表示查找今天修改过的文件,-mtime -7 表示查找一周以前修改过的文件。
关于时间 n 参数的说明:
-
+n
:查找比 n 天前更早的文件或目录。 -
-n
:查找在 n 天内更改过属性的文件或目录。 -
n
:查找在 n 天前(指定那一天)更改过属性的文件或目录。
例:
-
按文件名查找
查找/etc下面的hosts文件
find /etc -name hosts find /etc -name HOSTS find /etc -iname hosts # -i表示忽略文件大小写 find /etc -iname hos* # 模糊查找
-
按文件大小查找
查找/etc下大于,小于,等于5M的文件
find /etc/ -size +5M # 大于5M ls -l /etc/udev/hwdb.bin -h dd if=/dev/zero of=/tmp/5M.txt bs=1M count=5 find / -size 5M # 等于5M ls -lh /tmp/5M.txt find /etc/ -size -5M # 小于5M
-
指定查找的目录深度
ls /etc/sysconfig/network-scripts/ifcfg-ens33 find / -maxdepth 3 -a -name "ifcfg-en*" find / -maxdepth 4 -a -name "ifcfg-en*"
-
按文件属主、属组查找
查找属于li用户的文件
id li find /home -user li # 属主 find /home -group li # 属组 ls -lh /home/li/.bashrc
-
按文件类型查找
ls -l -d ./1.txt /tmp /dev/sda /dev/cdrom # 查看文件类型 find /tmp -type f # 查找普通文件类型 find /dev -type b # 查找块文件类型 find /etc -type l
-
按文件权限查找
touch 714.txt chmod 714 714.txt find . -perm 714 # 当前目录下查找 find . -perm 714 -ls # -ls为action
-
找到文件后处理动作
find . -perm 714 -print # 默认自带动作 find /etc/ -name ifcfg* -ok cp -rvf {} /data1 \; # 找到之后复制-ok连接,{}引用;\;结束
查找当前目录下名为 file.txt 的文件:
find . -name file.txt
将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
find . -name "*.c"
将当前目录及其子目录中的所有文件列出:
find . -type f
查找 /home 目录下大于 1MB 的文件:
find /home -size +1M
查找 /var/log 目录下在 7 天前修改过的文件:
find /var/log -mtime +7
将当前目录及其子目录下所有最近 20 天前更新过的文件列出,不多不少正好 20 天前的:
find . -ctime 20
将当前目录及其子目录下所有 20 天前及更早更新过的文件列出:
find . -ctime +20
将当前目录及其子目录下所有最近 20 天内更新过的文件列出:
find . -ctime 20
查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
find . -type f -perm 644 -exec ls -l {} \;
查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;
7.1.3 locate
locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。 一般情况我们只需要输入 **locate your_file_name** 即可查找指定文件。
locate
命令的基本语法如下:
locate [-d ][--help][--version][范本样式...]
参数说明:
-
-b
, --basename -- 仅匹配路径名的基本名称 -
-c
, --count -- 只输出找到的数量 -
-d
, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db -
-e
, --existing -- 仅打印当前现有文件的条目 -
-1
-- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。 -
-0
, --null -- 在输出上带有NULL的单独条目 -
-S
, --statistics -- 不搜索条目,打印有关每个数据库的统计信息 -
-q
-- 安静模式,不会显示任何错误讯息。 -
-P
, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接 -
-l
, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目 -
-n
-- 至多显示 n个输出。 -
-m
, --mmap -- 被忽略,为了向后兼容 -
-r
, --regexp REGEXP -- 使用基本正则表达式 -
--regex --
使用扩展正则表达式 -
-q
, --quiet -- 安静模式,不会显示任何错误讯息 -
-s
, --stdio -- 被忽略,为了向后兼容 -
-o
-- 指定资料库存的名称。
例:
查找 passwd 文件,输入以下命令:
locate passwd
搜索 etc 目录下所有以 sh 开头的文件 :
locate /etc/sh
忽略大小写搜索当前用户目录下所有以 r 开头的文件 :
locate -i ~/r
附加说明
locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。
locate 的速度比 find 快,它并不是真的查找,而是查数据库,一般文件数据库在 /var/lib/slocate/slocate.db 中,所以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库 ,命令为:
updatedb
默认情况下 updatedb 每天执行一次。