在Linux中,与文件搜索相关的命令常用的有 whereis,which,find 和 locate。下面分别介绍一个各个命令:
用法:
whereis [options] [-BMS <dir>... -f] <name>
选项:
-b search only for binaries
-B <dirs> define binaries lookup path
-m search only for manuals and infos
-M <dirs> define man and info lookup path
-s search only for sources
-S <dirs> define sources lookup path
-f terminate <dirs> argument list
-u search for unusual entries
-l output effective lookup paths
whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。它并没有从硬盘中依次查找,而是直接从数据库中查询。
shiyanlou:~/ $ whereis redis [20:33:24]
redis: /etc/redis
shiyanlou:~/ $ whereis shells [20:41:29]
shells: /etc/shells /usr/share/man/man5/shells.5.gz
用法: locate [-d path | --database=path] [-e | -E | --[non-]existing]
[-i | --ignore-case] [-w | --wholename] [-b | --basename]
[--limit=N | -l N] [-S | --statistics] [-0 | --null] [-c | --count]
[-P | -H | --nofollow] [-L | --follow] [-m | --mmap ] [ -s | --stdio ]
[-A | --all] [-p | --print] [-r | --regex ] [--regextype=TYPE]
[--max-database-age D] [--version] [--help]
pattern...
使用 locate 命令查找文件也不会遍历硬盘,它通过查询 /var/lib/mlocate/mlocate.db 数据库来检索信息。不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令来更新数据库。所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令。这个命令也不是内置的命令,在部分环境中需要手动安装,然后执行更新。
sudo apt-get update
sudo apt-get install locate
sudo updatedb
查找 /etc 下所有以 sh 开头的文件:
locate /etc/sh
查找 /usr/share/ 下所有 jpg 文件:
locate /usr/share/*.jpg
如果想只统计数目可以加上 -c 参数,-i 参数可以忽略大小写进行查找。
which 本身是 Shell 内建的一个命令,我们通常使用 which 来确定是否安装了某个指定的程序,因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果。也就是说,我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令。
shiyanlou:~/ $ which ping [20:48:05]
/bin/ping
shiyanlou:~/ $ which find [20:50:16]
/usr/bin/find
用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]
默认路径为当前目录;默认表达式为 -print
表达式可能由下列成份组成:操作符、选项、测试表达式以及动作:
操作符 (优先级递减;未做任何指定时默认使用 -and):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
位置选项 (总是真): -daystart -follow -regextype
普通选项 (总是真,在其它表达式前指定):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
测试(N可以是 +N 或-N 或 N):-amin N -anewer FILE -atime N -cmin
-cnewer 文件 -ctime N -empty -false -fstype 类型 -gid N -group 名称
-ilname 匹配模式 -iname 匹配模式 -inum N -ipath 匹配模式 -iregex 匹配模式
-links N -lname 匹配模式 -mmin N -mtime N -name 匹配模式 -newer 文件
-nouser -nogroup -path PATTERN -perm [-/]MODE -regex PATTERN
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
-context 文本
操作: -delete -print0 -printf 格式 -fprintf 文件 格式 -print
-fprint0 文件 -fprint 文件 -ls -fls 文件 -prune -quit
-exec 命令 ; -exec 命令 {} + -ok 命令 ;
-execdir 命令 ; -execdir 命令 {} + -okdir 命令 ;
find 应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
列出 home 目录中,当天(24 小时之内)有改动的文件:
find ~ -mtime 0
列出用户家目录下比 /etc 目录新的文件:
find ~ -newer /etc
搜索/etc/ 目录下面名字叫做 interfaces 的文件或者目录。
sudo find /etc/ -name interfaces