首先,在操作系统课程上,我们已经知道,在linux中,并没有后缀名的概念。所有的文件都一视同仁,种类都是“-”。后缀名一般是不强求的,只是如gcc等应用会检查的辅助,此时加上后缀名是通过编译器必须的。同时,加上后缀名也是方便我们辨认的途径。
所以,在linux中,有file这个命令,专门查看文件的类型:是ASCII文本文件还是Binary二进制文件。
#usage of file
file [whole path filename]
data file/ executable file/ ASCII text
同时,Linux也提供了很多查找文件的命令。
其中whereis和locate是什么文件都可以查找的,速度也较快,但有个局限是查找结果(依据)可能不是最新的。因为两者的查找依据是/var/lib/mlocate/mlocate.db的数据库内容,这个数据库默认一天才更新一次。也可以手动通过/etc/updatedb.conf手动触发更新。
但也正因为其实从数据库中提取查找数据,相比另一个直接从硬盘查找的find就显得快速多了。
whereis和find之间有什么区别呢?区别在于whereis只提供精确查找,但能归类查找,定义只查找一类型的这个名字的文件。而locate能够实现模糊查找,默认查找文件路径名中包含这个字符串的文件,同时也能指定不分大小写和正则表示法。
详细用法如下:
#usage of whereis
whereis [-b-m-s-u] [filename]
-b binary file
-m man file
-s source file
-u files other than those three above
#usage of locate
locate [-i-r] [filename]
-i ignore the upper case or lower case
-r use regular expression
同时,提供一个比较局限的,同时只能查找二进制可执行文件的命令:which
which的局限在于只能查找当前用户PATH目录下的命令。如ifconfig在/sbin只在root的path有,不在一般用户的/usr/sbin有,所有,一般用户用which ifconfig是找不到这个命令的。这时候可以考虑用type。
#usage of which
which [-a] [command name]
-a list all the result out, default is listing one
最后,我们看看一个功能强大的命令:find。
先说说怎么用吧:
#usage of find
find [Path] [Option] [Action]
# The command is to find the files that satisfy the condition mentioned by option under the path. Then we can do the actions to those file
E.g.
find /home -mtime 0
find /etc -newer /etc/passwd
以上两个例子给的option都是时间参数。
find的时间参数有以下的选项:
首先时间参数有三种 mtime、atime和ctime。针对每种time有以下三种数字格式,以mtime为例:-mtime +4/ -mtime -4 / -mtime 4。0表示现在,数字表示天。
上述的请求对应着在某个时间区间的条件,如下图:
当然,除了用数字,还可以用一个字符串:newer [file]。例如:-mtime newer [file_ins],寻找修改时间比file_ins这个文件的修改时间更靠近现在的所有文件。
find的参数可以指定用户、组参数:
-uid/ -gid/ -user / -group/ -nouser/ -nogroup
例如:-uid 1/ -gid 10/-user xiaojie/ -group staff/ -nouser/ -nogroup
其中,nouser和nogroup分别指的是:满足文件的创建者不在/etc/passwd的所有文件和满足文件所属组不存在于/etc/groups的所有文件。
find的参数也可以指定权限参数、名字或者大小:利用-perm指定权限,-name指定名字和-size指定大小。
同时,find也允许我们指定对应的action来处理find出来的结果。
例如:find / -perm +7000 -exec ls -l {} \;
注意最后的\;,因为";"在bash中有自己的意思,所以需要转移字符。表示exec的命令结束。{}表示将find找到的内容移动括号里。
注意,find返回的是找到的符合条件的文件的完整路径文件名。所以,得到的结果可以传入ls -l 后面的路径文件名参数。