这是我学习linux的过程,每天都会更新所学习的知识总结,每个例子都是我自己的亲手实践的,作为新人的我希望各位大佬提出宝贵的意见!!
在终端模式当中,输入[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 所提供的指令) 或是内建在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 只找几个特定的目录而已~并没有全系统去查询之故。所以说,whereis 主要是针对/bin /sbin 底下的执行档, 以及/usr/share/man 底下的man page 档案,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些档案是你找不到的啦!想要知道whereis 到底查了多少目录?可以使用whereis -l 来确认一下即可!
这个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 内的资料库记载,找出使用者输入的关键字档名我们现在知道atime, ctime与mtime的意义,如果你想要找出一天内被更动过的档案名称,可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的档案档名』呢?那可以使用『 find /var -mtime -4』。那如果是『4天前的那一天』就用『 find /var -mtime 4』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下
图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图6.5.1 我们可以清楚的知道:
+4代表大于等于5天前的档名:ex> find /var -mtime +4-4代表小于等于4天内的档案档名:ex> find /var -mtime -44则是代表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 +1Mfind 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:
该范例中特殊的地方有{} 以及; 还有-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*'