十、文件/目录-查找

king's blog
在linux下,经常用到查找命令,比如whereis、which、find等,本节主要内容如下:
一、查看文件类型:file
二、查看命令类型:type
三、查找命令路径:which
四、查找文件:whereis / locate / find

一、查看文件类型:file

如果想要知道某个文件的基本数据,例如是属于ASCII、data、binary,或者其中有没有使用动态函式库(share library)等等的信息,可用file命令进行查看

命令格式:file filename

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ETS157:/opt/project # file /opt/oracle/product/11.2.0/dbhome_1/inventory/Components21/oracle.sysman.console.db
/opt/oracle/product/11.2.0/dbhome_1/inventory/Components21/oracle.sysman.console.db: directory

ETS157:/opt/project # file result.txt
result.txt: ASCII text, with CRLF line terminators

ETS157:/opt/project # file clean_excess_logs_0.2.sh
clean_excess_logs_0.2.sh: Bourne-Again shell script text

ETS157:/opt/project # file /etc/passwd
/etc/passwd: ASCII text

ETS157:/opt/project # file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), stripped

二、查看命令类型:type

Type命令是linux系统的一种自省机制,当知道了是哪种类型的命令后,可以知道如何获取帮助,比如:bash内建命令可以用help来获取帮助,外部命令则可以用man 或者 info来获取帮助。

命令格式:type [-apft] command
参数说明:
-a:返回所有可能的类型,因为有些命令是多种类型。比如:pwd既是内建命令,也是外部命令
-p:只返回外部命令的信息
-f:只返回shell函数的信息
-t:之返回指定类型的信息

返回类型:
alias——–别名
keyword——关键字,Shell保留字
function—–函数,Shell函数
builtin——内建命令,Shell内建命令
file———文件,磁盘文件,外部命令
no found—–没有找到

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#返回别名
ETS157:/opt/project # type ll
ll is aliased to `ls -l'

#返回关键字
ETS157:/opt/project # type function
function is a shell keyword

#返回内建命令
ETS157:/opt/project # type cd
cd is a shell builtin

#返回no found
ETS157:/opt/project # type abcd
-bash: type: abcd: not found

三、查找命令路径:which

在终端机模式中,连续输入两次Tab键,就可以知道用户有多少指令可以下达(如下图所示),那这些指令的完整文件名存放在哪里?此时我们可以通过which和type来查找。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
oracle@ETS157:~>
Display all 3259 possibilities? (y or n)
!                                      mmd
+                                      mmencode
-                                      mmount
./                                     mmove
../                                    mmroff
...                                    modeline2fb
2to3                                   modeprint
3Ddiag                                 modetest
3Ddiag-result                          modinfo
3Ddiag.devel                           modprobe
3Ddiag.dri                             module_upgrade
3Ddiag.ignoredb                        mofcomp
3Ddiag.nvidia_glx                      more
3Ddiag.runtime                         mount
3dinfo                                 mount.cifs
411toppm                               mount.crypt
:                                      mount.encfs13
BackGround                             mount.fuse
Backarrow2BackSpace                    mount.nfs
Backarrow2Delete                       mount.nfs4
ChangeSymlinks                         mountpoint
Check                                  mountstats
ControlPanel                           mouse-test
FvwmCommand                            mpartition
...

命令格式:which [-a] command

参数说明:
-a:将所有在$PATH目录中可以找到的命令都列出了,而不是之显示第一个找到的命令名称

例子-1:
用root用户去查找ifconfig命令

1
2
3
4
ETS157:/opt # echo $PATH
/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/opt/project/jdk1.6.0_38/bin
ETS157:/opt # which -a ifconfig
/sbin/ifconfig

例子-2:
用oracle用户去查找ifconfig命令

1
2
3
4
oracle@ETS157:~> echo $PATH
/opt/oracle/product/11.2.0/dbhome_1/bin:/opt/oracle/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/opt/project/jdk1.6.0_38/bin
oracle@ETS157:~> which -a ifconfig
which: no ifconfig in (/opt/oracle/product/11.2.0/dbhome_1/bin:/opt/oracle/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/opt/project/jdk1.6.0_38/bin)

上面的例子中,用root用户能找到ifconfig,而oracle用户则不能,原因就在于/sbin默认是在root用户的$PATH环境变量中,不在oracle用户的$PATH中,所以出现上面的差异。所以我们经常用ifconfig查询ip地址的时候,默认情况下,非root用户直接输入ifconifg则会报命令找不到(如下)就是这个原因,而需要输入完整的路径/sbin/ifconfig,原因就在于此。

oracle@ETS157:~> ifconfig
Absolute path to ‘ifconfig’ is ‘/sbin/ifconfig’, so it might be intended to be run only by user with superuser privileges (eg. root).
-bash: ifconfig: command not found

四、查找文件:whereis / locate / find

查找文件,在linux下有很多这样的命令,通常我们先用whereis或者locate来检查,如果真找不到,才用find进行查找,为什么呢?因为whereis和locate是利用数据库库查找数据,不实际查找硬盘,所以速度很快。find则是对硬盘进行直接搜索,速度较慢。

需要注意的是,Linux系统会将系统内的所有文件都记录在一个数据库档案里面,当使用whereis或者locate时,都会以此数据库档案的内容为准,因此,有时还会发现使用这两命令,会找到已经被删除的文件,而找不到最新创建的文件,这是因为新创建的文件暂未更新到数据库中。原因在于数据库的更新默认每天执行一次(每个distribution不同),当然也可以手动更新数据库,输入updatedb即可(系统自动读取/etc/updatedb.confg文件)

1、whereis

命令格式:whereis [-bmsu] 文件或者目录名

参数说明:
-b :只找binary格式的文件
-m :只找在说明文件manual路径下的文件
-s :只找source来源文件
-u :查找不在上述三个项目中的其他特殊文件
不加参数则将所有的都查找出来

例子:

1
2
3
4
5
6
7
8
oracle@ETS157:~> whereis -m passwd
passwd: /usr/share/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz /usr/share/man/man1/passwd.1ssl.gz
oracle@ETS157:~> whereis -m cd
cd: /usr/share/man/mann/cd.n.gz /usr/share/man/man1p/cd.1p.gz
oracle@ETS157:~> whereis -m ls
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
oracle@ETS157:~> whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
2、locate

命令格式:
locate [-ir] keyword

参数说明:
-i :忽略大小写
-r :正规表示法的显示方式

例子:

1
2
3
4
5
6
[weblogic@QA1 ~]$ locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/var/lib/yum/yumdb/p/e5bf65957bcc575c67c15c0a4a2ca7711b409842-pam_passwdqc-1.0.5-6.el6-x86_64/reason

whereis和locate两个命令搜索速度都很快,那有什么区别呢,从上面的例子可以看出
whereis:只是搜索文件名
locate:不仅仅搜索文件名,连路径含有搜索关键字的也会被搜索到,搜索范围比whereis大

3、find

命令格式:find SearchPath -options SearchExpression [-print -exec -ok]

参数说明:
SearchPath :find的查找路径,也就是在哪个路径下进行搜索,如.表示当前路;/表示根目录
SearchExpression :查找表达式
-print :find命令将匹配的文件输出到标准输出 (默认自动添加)
-exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形为’command’ {} \;,注意{ }和\;之间的空格。
-ok :与exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

例子:
find . -print 输出当前目录下所有的子文件
find . -name a.sh -exec ls -l {} \; 在当前目录及子目录下搜索名为a.sh的文件,并执行ls -l命令
find . -name a.sh -ok ls -l {} \; 在当前目录及子目录下搜索名为a.sh的问,并将其删除

Option说明:
1、-name 按照文件名查找文件
find . -name “*.sh” 在当前目录及子目录下查找扩展名为sh的文件

2、-perm 按照文件权限来查找文件
find . -perm 750 在当前目录及子目录下查找权限位为750的文件(精确)
find . -perm -111 在当前目录及目录下查找,只要所有用户均具有执行权限的文件(模糊)

3、-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth 选项,那么-prune选项将被find命令忽略。

4、-user 按照文件属主来查找文件。
find . -user imapuser 在当前目录及子目录下查看用户为imapuser的文件

5、-nouser 查找属主帐号被删除的文件,即该文件的属主在/etc/passwd中不存在,查找时不用给出属主帐号,系统会自动查找
find / -nouser 在根目录下搜索属主在/etc/passwd的不存在的文件

6、-group 按照文件所属的组来查找文件。
find . -group root 在当前目录及子目录下查看用户组为imapgroup的文件

7、-nogroup 查找属组帐号被删除的文件,即该文件所属的组在/etc/groups中不存在。
find / -nogroup 在根目录下搜索属组在/etc/group中不存在的文件

8、-mtime -n +n 按照文件的更改时间来查找文件
– n 表示文件更改时间距现在n天以内,
+ n 表示文件更改时间距现在n天以前
find命令还有-atime和-ctime选项,但它们都和-mtime选项相似, 所以我们在这里只介绍-mtime选项。
find / -mtime -3 在根目录下查看3天之内修改过的文件
find / -ctime +3 在根目录下查看3天之内创建的文件

9、-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
find . -newer a.sh ! -newer c.sh 在当前目录下查看文件的的更改时间介于a.sh、b.sh更改时间之间的文件

10、-type 查找某一类型的文件,诸如:
b – 块设备文件。
d – 目录。
c – 字符设备文件。
p – 管道文件。
l – 符号链接文件。
f – 普通文件。
find / -type f 查找根目录下所有的普通文件

11、-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
find . -size +1000000c -print 当前目录下查找文件长度大于1 M字节的文件
find . -size 100c -print 当前目录下查找文件长度等于100字节的文件
find . -size +10 -print 当前目录下查找长度超过1 0块的文件(一块等于5 1 2字节)

12、 -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
find . -name “*.sh”

13、 -fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

·14、-mount 在查找文件时不跨越文件系统mount点。
find . -name “*.XC” -mount -print 当前目录开始查找位于本文件系统中文件名以XC结尾的文件

Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading