阿宁的linux学习---文档档名搜索

这是我学习linux的过程,每天都会更新所学习的知识总结,每个例子都是我自己的亲手实践的,作为新人的我希望各位大佬提出宝贵的意见!!

命令文件名的搜寻

which(寻找【执行档】)

在终端模式当中,输入[tab]J键能够知道有多少指令可以使用,但是不知道存放这些命令的文件放在那里,这时候就透过which或type来寻找!!

[root@localhost ~]# which [-a] commamd
选项或参数
-a:将所有由PTH目录中可以找到的指令均列出,而不止第一个被找到的指令名称
范例一:搜寻infconf这个指令的完整文件名
[root@localhost ~]# which ifconfig
/usr/sbin/ifconfig
范例二:用which去找出which的文档名
[root@localhost ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
	/usr/bin/alias
	/usr/bin/which
范例三:请找出history这个指令的完整文档名
[root@localhost ~]# which history
/usr/bin/which: no history in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@localhost ~]# history --help
bash: history: --: 无效选项
history: 用法:history [-c] [-d 偏移量] [n]history -anrw [文件名]history -ps 参数 [参数...]

这个指令是根据『PATH』这个环境变数所规范的路径,去搜寻『执行档』的档名~所以,重点是找出『执行档』而已!且which后面接的是『完整档名』喔!若加上-a选项,则可以列出所有的可以找到的同名执行档,而非仅显示第一个而已!

查询指令是否为Bash shell 的内建命令: type

我们怎么知道这个指令是来自于外部指令(指的是其他非bash 所提供的指令) 或是内建在bash 当中的呢?嘿嘿!利用type 这个指令来观察即可!

[root@localhost ~]# type [tpa] name
选项参数:
  :不加任何选项与参数时,type会显示出name是外部指令还是bash内建指令
-t:当加入 -t 参数时,type会将name以底下这些字眼显示出他的意义:
	file:表示为外部指令
	alias:表示该指令为命令别名所设定的名称
	bulitin:表示该指令为bash内建的指令功能
-p:如果后面接的name为外部指令时,才会显示完整文档名
-a:会由APTH变数定义的路径中,将所有含有name的指令都列出来,包含alias
范例一:
[root@localhost ~]# type ls
ls`ls --color=auto' 的别名
[root@localhost ~]# type -t ls
alias
[root@localhost ~]# type -a ls
ls`ls --color=auto' 的别名
ls 是 /usr/bin/ls
范例二:
[root@localhost ~]# type cd
cd 是 shell 内嵌

透过type这个指令我们可以知道每个指令是否为bash的内建指令。此外,由于利用type搜寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到,那么该名称是不会被显示出来的。

文档档名搜寻

whereis(由一些特定的目录中寻找档案名称)
[root@localhost ~]# whereis [-bmsu]档案名或目录
选项与参数:
-l:可以列出whereis会去查询的几个主要目录
-b:只找binary格式的档案
-m:只找在说明档manual路径下的档案
-s:只找sonurce来源档案
-u:搜寻不在上述三个项目中的其他特殊档案
范例一:
[root@localhost ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
范例二:
[root@localhost ~]# whereis passwd  #全部档名都列出来
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[root@localhost ~]# whereis -m passwd  #只有在man里面的档名才能搜到
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

whereis 只找几个特定的目录而已~并没有全系统去查询之故。所以说,whereis 主要是针对/bin /sbin 底下的执行档, 以及/usr/share/man 底下的man page 档案,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些档案是你找不到的啦!想要知道whereis 到底查了多少目录?可以使用whereis -l 来确认一下即可!

locate/updatedb
[root@localhost ~]# locate [-ir] keyword
选项与参数:
-i:忽略大小写的差异
-c:不输出档名,仅计算找到的档案数量
-l:仅输出几行的意思
-S:输出laocate所使用的资料库档案的相关资讯,包括该资料库记录的档案/目录数量等
-r:后面可接正规表示法的显示方式
范例一:找出系统中所有与passwd相关的档名,且只列出5个
[root@localhost ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
范例二:列出locate查询所使用的资料库档案之档名与各资料数量
[root@localhost ~]# locate -S
数据库 /var/lib/mlocate/mlocate.db:
	18,161 文件夹
	230,104 文件
	13,416,157 文件名中的字节数
	5,640,525 字节用于存储数据库

这个locate 的使用更简单,直接在后面输入『档案的部分名称』后,就能够得到结果。举上面的例子来说,我输入locate passwd ,那么在完整档名(包含路径名称) 当中,只要有passwd 在其中, 就会被显示出来的!

因为他是经由资料库来搜寻的,而资料库的建立预设是在每天执行一次(每个distribution 都不同,CentOS 7.x 是每天更新资料库一次!),所以当你新建立起来的档案, 却还在资料库更新之前搜寻该档案,那么locate 会告诉你『找不到!』呵呵!因为必须要更新资料库呀!

那能否手动更新资料库哪?当然可以啊!更新locate 资料库的方法非常简单,直接输入『 updatedb 』就可以了!updatedb 指令会去读取/etc/updatedb.conf 这个设定档的设定,然后再去硬碟里面进行搜寻档名的动作, 最后就更新整个资料库档案啰!因为updatedb 会去搜寻硬碟,所以当你执行updatedb 时,可能会等待数分钟

  • updatedb:根据/etc/updatedb.conf 的设定去搜寻系统硬碟内的档名,并更新/var/lib/mlocate 内的资料库档案;
  • locate:依据/var/lib/mlocate 内的资料库记载,找出使用者输入的关键字档名
find
[root@study ~]# 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@study ~]# find / -mtime 0 
#那个0是重点!0代表目前的时间,所以,从现在开始到24小时前,
# 有变动过内容的档案都会被列出来!那如果是三天前的24 小时内?
# find / -mtime 3 有变动过的档案都被列出的意思!
范例二:寻找/etc底下的档案,如果档案日期比/etc/passwd新就列出
[root@study ~]# find /etc -newer /etc/passwd 
# -newer用在分辨两个档案之间的新旧关系是很有用的!

我们现在知道atime, ctime与mtime的意义,如果你想要找出一天内被更动过的档案名称,可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的档案档名』呢?那可以使用『 find /var -mtime -4』。那如果是『4天前的那一天』就用『 find /var -mtime 4』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下

img

图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图6.5.1 我们可以清楚的知道:

  • +4代表大于等于5天前的档名:ex> find /var -mtime +4
  • -4代表小于等于4天内的档案档名:ex> find /var -mtime -4
  • 4则是代表4-5那一天的档案档名:ex> find /var -mtime 4
选项与参数:
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底下属于dmtsai的档案
[root@study ~]# find /home -user dmtsai 
#这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有档案时,
# 就可以利用这个指令将属于某个使用者的所有档案都找出来喔!
范例四:搜寻系统中不属于任何人的档案
[root@study ~]# find / -nouser 
#透过这个指令,可以轻易的就找出那些不太正常的档案。如果有找到不属于系统任何人的档案时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软体时。

-nouser 或-nogroup 的选项功能中,除了你自行由网路上面下载档案时会发生之外, 如果你将系统里面某个帐号删除了,但是该帐号已经在系统内建立很多档案时,就可能会发生无主孤魂的档案存在!此时你就得使用这个-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@study ~]# find / -name passwd
范例五-1:找出档名包含了passwd这个关键字的档案
[root@study ~]# find / -name "*passwd*" 
#利用这个-name可以搜寻档名啊!预设是完整档名,如果想要找关键字,
# 可以使用类似* 的任意字元来处理
范例六:找出/run目录下,档案类型为Socket的档名有哪些?
[root@study ~]# find /run -type s 
#这个-type的属性也很有帮助喔!尤其是要找出那些怪异的档案,
# 例如socket 与FIFO 档案,可以用find /run -type p 或-type s 来找!
范例七:搜寻档案当中含有SGID或SUID或SBIT的属性
[root@study ~]# find / -perm /7000 
#所谓的7000就是---s--s--t ,那么只要含有s或t的就列出,所以当然要使用/7000,
# 使用-7000 表示要同时含有---s--s--t 的所有三个权限。而只需要任意一个,就是/7000 ~了乎?

假设我想要找出来/usr/bin, /usr/sbin 这两个目录下, 只要具有SUID 或SGID 就列出来该档案,你可以这样做:

[root@study ~]# find /usr/bin /usr/sbin -perm /6000

因为SUID是4分,SGID 2分,总共为6分,因此可用/6000来处理这个权限!至于find后面可以接多个目录来进行搜寻!另外,find本来就会搜寻次目录

选项与参数:
4. 额外可进行的动作:
   -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
   -print :将结果列印到萤幕上,这个动作是预设动作!
范例八:将上个范例找到的档案使用ls -l列出来~ 
[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; 
#注意到,那个-exec后面的ls -l就是额外的指令,指令不支援命令别名,
# 所以仅能使用ls -l 不可以使用ll 喔!注意注意!
范例九:找出系统中,大于1MB的档案
[root@study ~]# find / -size +1M

find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:

find 相关的额外动作

该范例中特殊的地方有{} 以及; 还有-exec 这个关键字,这些东西的意义为:

  • {} 代表的是『由find 找到的内容』,如上图所示,find 的结果会被放置到{} 位置中;
  • -exec 一直到; 是关键字,代表find 额外动作的开始(-exec) 到结束(😉 ,在这中间的就是find 指令内的额外动作。在本例中就是『 ls -l {} 』啰!
  • 因为『 ; 』在bash 环境下是有特殊意义的,因此利用反斜线来跳脱。

find 还可以利用万用字元来找寻档名呢!举例来说,你想要找出/etc 底下档名包含httpd 的档案, 那么你就可以这样做:

[root@study ~]# find /etc -name '*httpd*'

关键字,代表find 额外动作的开始(-exec) 到结束(😉 ,在这中间的就是find 指令内的额外动作。在本例中就是『 ls -l {} 』啰!

  • 因为『 ; 』在bash 环境下是有特殊意义的,因此利用反斜线来跳脱。

find 还可以利用万用字元来找寻档名呢!举例来说,你想要找出/etc 底下档名包含httpd 的档案, 那么你就可以这样做:

[root@study ~]# find /etc -name '*httpd*'
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值