如何在Linux系统中使用命令find、which、whereis、locate查找文件

在Linux下通常我们需要修改或维护一些文件,但是不知道它到底在哪,这时候就要求我们知道如何在Linux下进行文件查找的操作了。这里总结四种查找命令:which、whereis、locate、find。但是find不是很常用,因为查找的速度慢,而whereis和locate是我们常用的,它们是利用数据库来查找数据的,所以相当快速,而且没有实际查询硬盘,比较节省时间,下面分别介绍这四种命令的使用方法.

which(寻找执行文件)

which是根据用户设置的PATH变量内的目录去查找可执行文件的,所以不同的PATH设置的内容所找到的命令也不一样,当我们用root用户和普通用户来查找同一个命令时,得到的结果也会不一样了。

root用户:

# which ls

alias ls='ls --color=auto'

    /usr/bin/ls

1

2

3

使用su - sadmin切换到普通用户sadmin

$ which ls

alias ls='ls --color=auto'

    /bin/ls

1

2

3

可以使用快捷键CTRL+D退出,或者输入命令exit。

whereis(寻找特定文件)

Linux系统会将系统内所有的文件都记录到一个数据库文件里面,当使用whereis或者locate时,都会以此数据库文件的内容作为标准,因此,有时我们会查找到已经被删除的文件,而且还找不到新建立的文件。

whereis可以加入参数查找相关的数据

用法:

    whereis [options] file

Options:

-b        只搜索二进制文件(可执行文件)

-B <目录>  定义二进制文件查找路径

-m        只搜索在说明文件manual路径下的文件

-M <目录>  定义 man 手册查找路径

-s        只搜索源代码

-S <目录>  定义源代码查找路径

-f        终止 <目录> 参数列表

-u        搜索不常见记录(不在-b -m -s选项中)

-l        输出有效查找路径

1

2

3

4

5

6

7

8

9

10

11

12

查找passwd这个文件名有关的所有数据

# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz

1

2

只查找跟passwd有关的“说明文件”文件名

# whereis -m passwd

passwd: /usr/share/man/man1/passwd.1.gz

1

2

locate

locate命令比较简单,直接在后面输入”文件的部分名称”后就可以得到结果,如果我们忘记了某个文件的完整文件名时可以使用这个文件来查找

如果输入该命令提示-bash: locate: command not found,那么需要我们先进行安装:

# yum -y install mlocate

1

安装好了之后不能马上进行数据查询,得先将数据库初始化

# updatedb

1

初始化完成就可以使用locate进行文件查找了

# locate passwd

/etc/passwd

/etc/passwd-

/etc/pam.d/passwd

/etc/security/opasswd

/usr/bin/gpasswd

/usr/bin/grub2-mkpasswd-pbkdf2

/usr/bin/htpasswd

/usr/bin/lppasswd

/usr/bin/passwd

/usr/include/rpcsvc/yppasswd.h

/usr/include/rpcsvc/yppasswd.x

/usr/lib/firewalld/services/kpasswd.xml

/usr/lib64/security/pam_unix_passwd.so

/usr/local/aegis/PythonLoader/lib/python2.7/test/keycert.passwd.pem

/usr/local/aegis/PythonLoader/lib/python2.7/test/ssl_key.passwd.pem

......

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

所有包含passwd的文件名都被列出来了

用法:

    # locate [-ir] keyword

参数:

    -i 忽略大小写的差异

    -r 后面可接正则表达式的显示方式

1

2

3

4

5

但是使用locate寻找的数据是从已经创建的数据库/var/lib/mlocate/里面的数据查找的,所以不会直接从硬盘当中访问数据,当然就快速,但是数据库的创建默认是每天执行一次(每个distribution都不同),所以我们新建的文件没有被数据库收录,当然就找不到了,这时我们可以使用updatedb命令进行手动更新。

updatedb命令会去读取/etc/updatedb.conf这个配置文件的设置,然后再去硬盘里进行查找文件名的操作,最后更新整个数据库文件/var/lib/mlocate,因为要在硬盘上进行文件查找,所以可能会等一会儿或者几分钟的时间。

locate:依据/var/lib/mlocate内的数据库记载,找出用户输入的关键字文件名

find

find是很强大的查找命令,但是花费的时间多,每一次查询都要直接去硬盘进行查找。

1.与时间有关的参数

-mtime n: n 为数字,意思是几天之前的"一天之内"被更改过的文件

-mtime +n: 列出n天之前(不包含n本身)被更改过的文件名

-mtime -n: 列出n天之内(包含n本身)被更改过的文件名

-nerer file: file为存在的一个文件,列出比file还要新的文件名

1

2

3

4

5

6

7

将系统中24小时内被改过的文件列出

# find / -mtime 0

/后面没有接具体的目录,代表把系统中所有有关的都列出来,0代表的是现在开始的24小时前,如果是列出2天前的24小时之内被改动过的文件的话,# find / -mtime 2

查找/etc下面的文件,如果比/etc/passwd新就列出

# find /etc -newer /etc/passwd

1

-newer用来区别两个文件的新旧关系

2.与用户或用户组有关的参数

-uid n:n 为数字,就是用户的UID,记录在/etc/passwd文件中与用户名对应的数字

-gid n: n 为数字,就是用户组的UID,记录在/etc/group文件中与用户组名对应的数字

-user name: name 是用户账号的名称

-group name: name 是用户组的名称

-nouser: 寻找文件的所有者不在/etc/passwd的文件

-nogroup: 寻找文件的用户组不在/etc/group的文件

1

2

3

4

5

6

查找/home下面属于sadmin的文件

# find /home user sadmin

/home

/home/sadmin

/home/sadmin/.bash_logout

/home/sadmin/.ssh

/home/sadmin/.ssh/known_hosts

/home/sadmin/.bashrc

/home/sadmin/.bash_profile

/home/sadmin/.bash_history

1

2

3

4

5

6

7

8

9

10

查找系统中不属于任何人的文件

# find / -nouser

1

通过这个命令可以轻易找出不太正常的文件,如果有不属于系统任何人的人间时不用紧张,有时候这些文件是正常的,使用-nouser或-nogroup时,除了在网上下载的文件,还有可能你将某个账号删除了,但是这个账号已经在系统内建立了很多文件,这时就会发现很多无主孤魂的文件。

3.与文件权限有关的参数

-name filename:查找文件名为filename的文件

-size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件,SIZE的规格:

            c:代表byte k:代表1024byte,查找比50kb还大的文件就是"-size +50k"

-type TYPE: 查找文件类型为TYPE的文件,类型一般有:

            一般正规文件(f)、设备文件(b、c)、目录(d)、socket(s)等

-perm mode: 查找文件权限正好是mode的文件,这个mode为类似chomd的属性值,下同

-perm -mode:查找文件权限“必须全部包含mode的权限”的文件,当我们要查找一个权限为"-rwxr--r--",

            即0744的文件,使用-perm -0744 ,当一个文件为"-rwsr-xr-x",即0755时也会被列出来,因为"-rwsr-xr-x"的属性已经包含了"-rwxr--r--"的属性

-perm +mode:查找文件权限“包含任一mode的权限”的文件

1

2

3

4

5

6

7

8

9

查找文件名为passwd的文件

# find / -name passwd

/usr/bin/passwd

/etc/passwd

/etc/pam.d/passwd

......

1

2

3

4

5

6

查找/var目录下类型为Socket的文件

# find /var -type s

/var/spool/postfix/public/pickup

/var/spool/postfix/public/showq

/var/spool/postfix/public/cleanup

/var/spool/postfix/public/flush

/var/spool/postfix/public/qmgr

/var/spool/postfix/private/scache

/var/spool/postfix/private/tlsmgr

/var/spool/postfix/private/verify

/var/spool/postfix/private/proxymap

/var/spool/postfix/private/smtp

/var/spool/postfix/private/retry

......

1

2

3

4

5

6

7

8

9

10

11

12

13

14

查找/bin,/sbin目录下具有SUID或SGID的文件

# find /bin /sbin -perm +6000

1

因为SUID是4分,SGID是2分,总共6分,因此可以用+6000来处理这个权限,还可以多个目录查找,用空格隔开

4.其他可进行的操作

-exec commad:command为其他命令,-exec后面可以再接其他命令来处理查到的结果

-print :将结果打印到屏幕,这个是默认的操作

1

2

将“查找/bin,/sbin目录下具有SUID或SGID的文件”找到的文件用ls -l列出来:

# find /var -type s -exec ls -l {} \;

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/pickup

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/showq

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/cleanup

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/flush

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/qmgr

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/scache

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/tlsmgr

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/verify

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/proxymap

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/smtp

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/retry

srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/bounce

......

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

-exec后面的ls -l 就是额外的命令,命令不支持别名,所以只能写成ls -l,不能写成ll

find的特殊功能额外命令的图解:

在这条命令中,有{}以及\;,还有-exec关键词

{}代表的是由find找到的内容,上图所示,find找到的结果会被放到{}位置中

-exec一直到\;是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间就是find命令内的额外命令,图中的额外命令是ls -l {}。

因为;在bash环境下是有特殊意义的,所以用反斜杠来转义。

find可以使用通配符

如果我们需要找具有特殊属性的文件,利用locate没法找到的,这个时候find就很重要了

find命令还可以使用通配符来查找文件名,如果我们想找到/etc文件名下包含http的文件,我们可以写成下面的格式:

# find /etc -name '*http*'

1

find不但可以指定查找的目录(连同子目录),还可以利用额外的参数来找到最正确的文件名,所以find命令很重要

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容