Linux学习(8)--命令与文件的查询

命令与文件的查询

虽然某些软件配置文件的文件名是不变的,但是各个distribution放置的目录是不同的。此时就要利用一些查询命令将该配置文件的完整文件名找出来。

脚本文件名的查询

我们知道在Terminal中,连续输入两次[Tab]就可以知道用户有多少命令可以执行。那我们怎么知道这些命令的完整文件名放在哪里?此时就需要 while 或 type来查找。

- which(寻找执行文件)

[root@VM_174_157_centos tmp]# which [-a] command
选项与参数:
-a:将所有有PATH目录中可以找到的命令列出,而不只是第一个被找到的


范例1:分别用root与一般账号查询ifconfig这个命令的完整文件名
[root@VM_174_157_centos ~]# which ifconfig
/usr/sbin/ifconfig                    <==用root可以找到正确的执行文件名
[root@VM_174_157_centos ~]# su - WanGe       <==切换成WanGe
[WanGe@VM_174_157_centos ~]$ which ifconfig
/usr/bin/which: no ifconfig in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/home/WanGe/.local/bin:/home/WanGe/bin)    <==找不到了
#因为which是根据用户所设定的PATH变量内的目录去寻找可执行文件的
#不同的PATH设定内容所找到的命令当然不一样,因为/sbin没在WanGe的
#PATH中,所以找不到

范例2:用which去找which的文件名
[root@VM_174_157_centos ~]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    /usr/bin/alias
    /usr/bin/which
#竟然有两个which,其中一个是alias,这是什么呢?
#这个就是所谓的命令别名,意思是输入which会等于后面接的那串命令

文件名的查找

在Linux下面也有相当优异的查找命令。通常find不很常用,因为速度慢!通常我们都是先使用 whereis 或者 locate 来检查,实在找不到了才用 find。因为 whereis 和 locate 都是用数据库来查找,所以速度很快,而且没有实际查询硬盘,比较节省时间。

- whereis(寻找特定文件)

[root@VM_174_157_centos tmp]# whereis [-bmsu] 文件或目录名
选项与参数:
-b:只找二进制格式的文件
-m:只找在说明文件 manual 路径下的文件
-s:只找 source 源文件
-u:查找不在上述三个选项当中的其他特殊文件


范例1:用不同的身份找出 ifconfig 这个文件名
[root@VM_174_157_centos ~]# whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz   
[root@VM_174_157_centos ~]# su - WanGe        <==切换身份到 WanGe

[WanGe@VM_174_157_centos ~]$ whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz  <==找到同样的结果
[WanGe@VM_174_157_centos ~]$ logout
#一般用户找不到的 ifconfig 可以用 whereis 找到
#因为系统真的有这个文件,只是用户的PATH并没有加入 /sbin
#所以未来找不到命令的时候,先用文件查找看看

范例2:只找出跟 passwd 有关的“说明文件”文件名(man page)
[root@VM_174_157_centos ~]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz

那么 whereis 到底是使用什么呢?为什么会比find快那么多?其实只是因为Linux系统会将系统内的所有文件都记录在一个数据库文件里面,而当使用whereis或者是下面要说的locate时,都会以此数据库文件的内容为准,因此,有时你还会发现使用这两个执行文件时,会找到已经被删除的文件!而且也找不到最新的刚刚创建的文件!

- locate

[root@VM_174_157_centos ~]# locate [-ir] keyword
选项与参数:
-i:忽略大小写的差异
-r:后面可接正则表达式的显示方式


范例1:找出系统中所有与 passwd 相关的文件名
[root@VM_174_157_centos ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
...(底下省略)...

locate的使用更简单,但是这个东西还是有一些使用上的限制。因为前面已经提到了lcoate是寻找已创建的数据库/var/lib/mlocate里面的数据所找到的,当然是很快速的。

  • 但是数据库的创建默认是每天执行一次,所以如果我们新建文件后查询该文件,那么locate会告诉你找不到,因为必须要更新数据库。
  • 当然我们也是可以手动更新数据库的,直接输入“updatedb”,这个命令回去读取/etc/updatedb.conf这个配置文件的设置,然后再去硬盘里面进行查找文件名的操作,最后就更新整个数据库的文件。因为这个命令会去查找硬盘,所以执行命令可能要等待数分钟。

- find

[root@VM_174_157_centos ~]# find [PATH] [option] [action]
选项与参数:
1.与时间相关的参数:共有 -atime 与 -mtime,下面以 mtime 说明
-mtime n:n为数字,意义围在 n 天前的“一天以内”被更改过内容的文档
-mtime +n:列出在 n 天之前(不含 n 天本身)被更改过的文件名
-mtime -n:列出在 n 天之内(含 n 天本身)被更改过的文件名
-newer file:file为一个存在的文件,列出比file还要新的文件名


范例1:将过去系统上面24小时内有改动(mtime)的文件列出
[root@VM_174_157_centos ~]# find -mtime 0
./.bash_history
#那个0是重点,0代表的是当前的时间,即从现在开始到24小时之前有改动
#过内容的文件都会被列出来,如果是3天前,那就是find -mtime 3了

范例2:寻找/etc下面的文件,如果文件日期比/etc/passwd新就列出
[root@VM_174_157_centos ~]# find /etc -newer /etc/passwd
/etc
/etc/gshadow
/etc/shadow
/etc/group
#用在分辨两个文件之前的新旧关系还是很有用的

时间参数还是挺意思的!但是如果我要找“4天内被更改过的文件名”呢?或者我们要找“4天前的那一天”呢?接下来就用图示来说明一下:

这里写图片描述

从图中我们可以清楚地看到:

  • +4 代表大于等于5天前的文件名:find /var -mtime +4
  • -4 代表小于等于4天内的文件名:find /var -mtime -4
  • 4则是代表4-5那天的文件名:find /var -mtime 4

我们再来看看 find 的其他用法:

选项与参数:
2.与用户或用户组名有关的参数:
-uid n:n 为数字,这个数字是用户的账户ID,即UID,这个UID是记录在
        /etc/passwd里面与账号名称对应的数字
-gid n:n 为数字,这个数字是用户组名的ID,即GID,这个UID是记录在
        /etc/group中的
-user name:name为用户账号名称
-group name:name为用户组名称
-nouser:寻找文件的所有者不存在于/etc/passwd的人
-nogroup:寻找文件的所有者不存在于/etc/group中的文件
        当你自行安装软件时,可能该软件的属性当中并没有文件所有者,
        这个时候,就要用到-nouser和-nogroup


范例3:查找/home下面属于WanGe的文件
[root@VM_174_157_centos ~]# find /home -user WanGe

范例4:查找系统中不属于任何人的文件
[root@VM_174_157_centos ~]# find / -nouser

除了来自于网上下载的文件,还有可能是以前的账号创建的文件,但是现在这个账号已经被删除了,这个时候就要用的-nouser了。

3.与文件权限及名称有关的参数:
选项与参数:
-name filename:查找文件名为filename的文件
-size [+-]SIZE:查找比SIZE还大(+)或小(-)的文件,这个SIZE的规格有:
            c:代表byte,k:代表kb
-type TYPE:查找文件类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),
            目录(d),连接文件(l),socket(s),及FIFO(p)等属性
-perm mode:查找文件权限“刚好等于”mode的文件,这个mode为权值,比如-rwsr-xr-x为4755
-perm -mode:查找文件权限“必须全部包括mode的权限”的文件,比如,我们要查找0744(-rwxr--r--)
            的文件,当一个文件权限为4755(-rwsr-xr-x)也会被列出来,因为包括了-rwxr--r--
-perm /mode:查找文件权限“包含任一 mode 的权限”的文件夹,比如,我们查找-rwsr-xr-x,但一个文
            件属性为-rw-------也会被列出来,因为它有-rw...的属性存在


范例5:找出文件名为passwd的文件
[root@VM_174_157_centos ~]# find / -name passwd

范例6:找出/var目录下,文件类型为socket的文件
[root@VM_174_157_centos ~]# find /var -type s

范例7:找出文件当中含有SGID或SUID或SBIT的属性
[root@VM_174_157_centos ~]# find / -perm /7000
#因为7000就是---s--s--t,那么只要有s或t就列出

范例8:找/bin、/sbin下具有SGID或SUID的文件
[root@VM_174_157_centos ~]# find /bin /sbin -perm +6000
#SUID为4,SGID为2

Tips:上面的-perm /mode,原来是-perm +mode,但是在findutils-4.5.11中已经改变了,原因是当我们使用符号去表示命令的时候会出现歧义。比如,我想执行“find / -perm 111”其实也可以写作“find / -perm +x”。在这个命令的介绍页面我们可以看到他的解释是:’+u+x’是有效的符号表示(等同于+u,+x,即权限为0111),因此,-pem +mode就会被错误地理解成-perm mode,它就会去找到权限刚好是0111的文件,而不是包含它的文件,所以’+’被换做了’/’。(u即没有权限,类似/etc/shadow,x即—x–x–x),原文为:

Deprecated, old way of searching for files with any of the permission bits in mode set. You should use -perm /mode instead. Trying to use the ’+’ syntax with symbolic modes will yield surprising results. For example, ’+u+x’ is a valid symbolic mode (equivalent to +u,+x, i.e. 0111) and will therefore not be evaluated as -perm +mode but instead as the exact mode specifier -perm mode and so it matches files with exact permissions 0111 instead of files with any execute bit set. If you found this paragraph confusing, you’re not alone - just use -perm /mode. This form of the -perm test is deprecated because the POSIX specification requires the interpretation of a leading ’+’ as being part of a symbolic mode, and so we switched to using ’/’ instead.

最后,我们来看看find的其他特殊功能

4.其他可进行的操作
选项与参数:
-exec command:command为其他命令,-exec后可接其他的命令来处理查找到的结果
-print:将结果打印到屏幕上,这个操作是默认操作


范例9:将上个范例找到的文件使用ls -l列出
[root@VM_174_157_centos etc]# find / -perm /7000 -exec ls -l {} \;
#注意到,ls -l就是额外的命令,命令不支持别名
#所以只能用ls -l不能用ll

find的特殊功能就是能够进行额外的动作(action)。我们来详细得讲讲范例9的含义:

这里写图片描述

  • {} 代表的是“由find找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中
  • -exec一直到 \; 是关键词,代表find额外动作的开始(-exec)到结束(\;),在这中间的就是find 命令的额外动作,在本例中就是“ls -l”
  • 因为 ; 在bash下是有特殊意义的,因此用 \ 来转义

如果你要找的文件是具有特殊属性的,如SUID、文件大小等,利用lcoate是不行的,find就显得重要了,find同样支持通配符,例如find /etc -name '*httpd*'就可以找出/etc所有文件名带httpd的文件了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值