linux 命令与文件的搜寻

1,which (寻找运行命令)

[root@www ~]# which [-a] command选项或参数:-a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称范例一:分别用root与一般帐号搜寻 ifconfig 这个命令的完整档名
[root@www ~]# which ifconfig
/sbin/ifconfig            <==用 root 可以找到正确的运行档名喔!
[root@www ~]# su - vbird<==切换身份成为 vbird 去!
[vbird@www ~]$ which ifconfig
/usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
:/home/vbird/bin)         <==见鬼了!竟然一般身份帐号找不到!# 因为 which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,# 不同的 PATH 配置内容所找到的命令当然不一样啦!因为 /sbin 不在 vbird 的 # PATH 中,找不到也是理所当然的啊!了乎?
[vbird@www ~]$ exit<==记得将身份切换回原本的 root范例二:用 which 去找出 which 的档名为何?
[root@www ~]# which which
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot ‘
        /usr/bin/which
# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?# 那就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令啦!# 更多的数据我们会在 bash 章节中再来谈的!范例三:请找出 cd 这个命令的完整档名
[root@www ~]# which cd
/usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin
:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)
# 瞎密?怎么可能没有 cd ,我明明就能够用 root 运行 cd 的啊!

这个命令根据(PATH)这个环境变量所规范的路径,去搜寻运行档的档名,所以,重点是找出运行档而已!而which后接的是(完整!档名)!若加上-a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已

2文件搜寻

find这个命令不怎么常用,因为速度慢而且很伤硬盘!通常我们都用whereis 或者是 locate来搜寻,如果找不到继续使用find来搜寻!前面两个之所以速度快,是因为他们利用数据库来搜寻数据,,并没有实际搜寻硬盘!

a whereis (寻找特定文件)


[root@www ~]# whereis [-bmsu] 文件或目录名选项与参数:-b    :只找 binary 格式的文件-m    :只找在说明档 manual 路径下的文件-s    :只找 source 来源文件-u    :搜寻不在上述三个项目当中的其他特殊文件范例一:请用不同的身份找出 ifconfig 这个档名
[root@www ~]# whereis ifconfig 
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@www ~]# su - vbird       <==切换身份成为 vbird
[vbird@www ~]$ whereis ifconfig<==找到同样的结果喔!
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[vbird@www ~]$ exit             <==回归身份成为 root 去!# 注意看,明明 which 一般使用者找不到的 ifconfig 却可以让 whereis 找到!# 这是因为系统真的有 ifconfig 这个『文件』,但是使用者的 PATH 并没有加入 /sbin# 所以,未来你找不到某些命令时,先用文件搜寻命令找找看再说!范例二:只找出跟 passwd 有关的『说明文件』档名(man page)
[root@www ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

b locate

[root@www ~]# locate [-ir] keyword选项与参数:-i  :忽略大小写的差异;-r  :后面可接正规表示法的显示方式范例一:找出系统中所有与 passwd 相关的档名
[root@www ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/news/passwd.nntp
/etc/pam.d/passwd
....(底下省略)....

locate使用非常简单,直接在后面输入(文件部分名称)就能够得到结果,据上面的例子来说,输入locate passwd ,那么在完整档名(包含路径名称)当中,只要passwd在其中,就会被显示出来!如果忘记文件全名就可以使用这个。

但是这个命令也有限制 ,locate寻找的数据是由(已创建的数据库 /var/lib/mlocate/)里面的数据搜寻到的,所以不用直接去硬盘里存取数据。所以当你创建了一个文件之后想要使用locate查询时,必须先要更新数据库。updatedb。命令回去读取/etc/updatedb.con f这个配置档的配置。然后去 硬盘里搜寻,最后升级整个数据库。


find


[root@www ~]# find [PATH] [option] [action]选项与参数:1. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明   -mtime  n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;   -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;   -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。   -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@www ~]# find / -mtime 0# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?# find / -mtime 3 有变动过的文件都被列出的意思!范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出
[root@www ~]# find /etc -newer /etc/passwd# -newer 用在分辨两个文件之间的新旧关系是很有用的!

时间参数听有意思,现在知道了atime ctime mtime 的意思 ,如果你想找出一天内被更改过得文件,可以使用上述范例一的做法,但是如果想找出4天内被更动过的文档档名呢?,那就可以使用 find /var-mtime 4 。 有没有加上 + - 差别很大!

  • +4代表大於等於5天前的档名:ex> find /var -mtime +4

  • -4代表小於等於4天内的文件档名:ex> find /var -mtime -4

  • 4则是代表4-5那一天的文件档名:ex> find /var -mtime 4

你可以在 /var/ 目录下搜寻一下,感受一下输出文件的差异喔!再来看看其他 find 的用法吧!

选项与参数:2. 与使用者或群组名称有关的参数:   -uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在            /etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。   -gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在            /etc/group,相关的介绍我们会第四篇说明~   -user name :name 为使用者帐号名称喔!例如 dmtsai    -group name:name 为群组名称喔,例如 users ;   -nouser    :寻找文件的拥有者不存在 /etc/passwd 的人!   -nogroup   :寻找文件的拥有群组不存在於 /etc/group 的文件!                当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,                这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。范例三:搜寻 /home 底下属於 vbird 的文件
[root@www ~]# find /home -user vbird# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,# 就可以利用这个命令将属於某个使用者的所有文件都找出来喔!范例四:搜寻系统中不属於任何人的文件
[root@www ~]# find / -nouser# 透过这个命令,可以轻易的就找出那些不太正常的文件。# 如果有找到不属於系统任何人的文件时,不要太紧张,# 那有时候是正常的~尤其是你曾经以原始码自行编译软件时。

选项与参数:3. 与文件权限及名称有关的参数:   -name filename:搜寻文件名称为 filename 的文件;   -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:                   c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB                   还要大的文件,就是『 -size +50k 』   -type TYPE    :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f),                   装置文件 (b, c), 目录 (d), 连结档 (l), socket (s),                    及 FIFO (p) 等属性。   -perm mode  :搜寻文件权限『刚好等於』 mode 的文件,这个 mode 为类似 chmod                 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !   -perm -mode :搜寻文件权限『必须要全部囊括 mode 的权限』的文件,举例来说,                 我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,                 当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,                 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。   -perm +mode :搜寻文件权限『包含任一 mode 的权限』的文件,举例来说,我们搜寻                 -rwxr-xr-x ,亦即 -perm +755 时,但一个文件属性为 -rw-------                 也会被列出来,因为他有 -rw.... 的属性存在!范例五:找出档名为 passwd 这个文件 [root@www ~]# find / -name passwd# 利用这个 -name 可以搜寻档名啊!范例六:找出 /var 目录下,文件类型为 Socket 的档名有哪些? [root@www ~]# find /var -type s# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,# 例如 socket 与 FIFO 文件,可以用 find /var -type p 或 -type s 来找!范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性 [root@www ~]# find / -perm +7000 # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,# 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限,# 因此,就是 +7000 ~了乎?

选项与参数:4. 额外可进行的动作:   -exec command :command 为其他命令,-exec 后面可再接额外的命令来处理搜寻到                   的结果。   -print        :将结果列印到萤幕上,这个动作是默认动作!范例八:将上个范例找到的文件使用 ls -l 列出来~
[root@www ~]# find / -perm +7000 -exec ls -l {} \;# 注意到,那个 -exec 后面的 ls -l 就是额外的命令,命令不支持命令别名,# 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意!范例九:找出系统中,大於 1MB 的文件
[root@www ~]# find / -size +1000k# 虽然在 man page 提到可以使用 M 与 G 分别代表 MB 与 GB,# 不过,俺却试不出来这个功能~所以,目前应该是仅支持到 c 与 k 吧!

如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等,那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦!另外,find 还可以利用万用字节来找寻档名呢!举例来说,你想要找出 /etc 底下档名包含 httpd 的文件,那么你就可以这样做:

[root@www ~]# find /etc -name ‘*httpd*‘


linux 命令与文件的搜寻,布布扣,bubuko.com

linux 命令与文件的搜寻

上一篇:[arm驱动]linux驱动程序基础篇目录


下一篇:Linux 磁盘100%