posts - 262,  comments - 221,  trackbacks - 0

【1.which命令】


which命令用于在系统变量PATH下所指定的路径中查找文件,因为PATH下一般存放的是可执行文件(二进制文件),所以which命令通常用来查找可执行文件。

由于不同的用户其PATH变量的设置不同,所以不同的用户执行同样的which命令,得到的结果有可能不同。

Example 1:以root用户身份执行which ifconfig
[root@localhost ~]# which ifconfig
/sbin/ifconfig
[root@localhost ~]
# echo $PATH
/usr/sbin:/u01/app/oracle/product/
10.2.0/db_1/bin:/u01/app/oracle/product/10.2.0/db_1/bin:/u01/app/oracle/product/10.2.0
/db_1/Apache/Apache/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

Example 2:以paul用户身份执行which ifconfig
[paul@localhost ~]$ which ifconfig
/usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/paul/bin)
[paul@localhost ~]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/paul/bin
[paul@localhost ~]$

可以看到,由于root用户和paul用户的PATH变量的设置不同,而ifconfig命令由仅存在于sbin目录下,所以paul用户执行which ifconfig时找不到该命令

【2.whereis和locate命令】

和which命令不同,whereis和locate命令可以搜索除了PATH变量指定路径下的其它目录和文件。先看下面的例子:

Example 1:使用root用户身份查找名为mount的文件
[root@localhost ~]# whereis mount
mount: /bin/mount /sbin/mount.cifs /sbin/mount.vmhgfs /sbin/mount.smbfs /sbin/mount.smb /usr/share/man/man8/mount
.8.gz /usr/share/man/man2/mount.2
.gz
You have new mail in /var/spool/mail/root
[root@localhost ~]
# whereis -b mount
mount: /bin/mount /sbin/mount.cifs /sbin/mount.vmhgfs /sbin/mount.smbfs /sbin/mount.smb
[root@localhost ~]#

Example 2:使用paul用户身份查找名为mount的文件
[paul@localhost ~]$ whereis mount
mount: /bin/mount /sbin/mount.cifs /sbin/mount.vmhgfs /sbin/mount.smbfs /sbin/mount.smb /usr/share/man/man8/mount
.8.gz /usr/share/man/man2/mount.2
.gz
[paul@localhost ~]
$ whereis -b mount
mount: /bin/mount /sbin/mount.cifs /sbin/mount.vmhgfs /sbin/mount.smbfs /sbin/mount.smb
[paul@localhost ~]$

我们看到,不论是以root身份还是以paul身份,whereis命令都可以找到名为mount的命令,而且搜索的结果中既包含了位于PATH变量指定的路径下,也包含了其它不在PATH变量中指定路径下的文件。

其次我们看到如果加上-b参数,搜索结果会不一样。这是因为-b参数是用于搜索二进制文件的(即可执行文件)。所以我们也可以用-b参数来缩小搜索结果范围

Example 3:使用locate命令来查找mount文件
[root@localhost~]#locate mount
warning: locate: could not open database: /var/lib/slocate/slocate.db: No such file or directory
warning: You need to run the 'updatedb' command (as root) to create the database.
Please have a look at /etc/updatedb.conf to enable the daily cron job.

很奇怪,系统居然提升我们找不到一个名为/var/lib/slocate/slocate.db的东东,而且要我们先执行一个updatedb的命令!这是为什么?

原因是因为locate命令的查找机制不是直接从硬盘中逐个搜索,比较文件。而是去搜索一个类似于“目录索引”的文件,该文件就像书的目录一样指向硬盘上的各个文件。

那么该索引文件又是哪里来的?答案就是通过updatedb创建,该命令会读取/etc/updatedb.conf文件,确定该索引文件的创建,更新机制。见下图
[root@localhost ~]# cat /etc/updatedb.conf
# To enable the updatedb in cron
, set DAILY_UPDATE to yes
DAILY_UPDATE=no

如果我们把no改成yes,那么Linux就会每天更新一次该索引文件(其实就是前面提到的那个db文件)。如果我们不更新呢?那么会出现下面两种可能
 ①已删除的过时文件会被搜索到
 ②新创建的文件不能被搜索到

这一切都是因为索引文件过时导致的,所以我们可以设置DAILY_UPDATE=yes

【3.find命令】


find命令和wheris命令以及locate命令,它是老老实实地去硬盘上找文件,所以速度比起前两者来说慢了很多。不过find命令有很多非常好用的参数。下面列出来:

 ①-mtime n:  列出在n天之前的“一天之内”被更动过的文件
 ②-mtime +n:列出在n天之前(不含n天本身)被更动过的文件
 ③-mtime -n:列出n天之内(含n天本身)被更动过的文件
 ④-newer file:列出比文件file还要新的文件名
 ⑤-user name:列出属于该用户的文件
 ⑥-group name:列出属于该用户组的文件
 ⑦-nouser:列出不属于/etc/passwd中定义的用户的文件
 ⑧-nogroup:列出不属于/etc/group中定义的用户组的文件
 ⑨-name filename:列出文件名为指定名称的所有文件
 ⑩-size +/- size:搜索比指定size还要大/小的文件。c表示byte,K表示Kb
 ⑾-type type:搜索指定类型文件。普通文件(f),配置文件(b,c),目录(d),链接文件(l),socket(s),管道(p)
 ⑿-exec command:在搜索的结果上执行指定的命令
 ⒀-print:将搜索的结果显示在屏幕上

<-----(+n)--------n-----(-n)-----当前时间

如我们想找出24小说被改动过的文件
[root@localhost ~]# find / -mtime 0

参数0是什么意思呢?其实0表示当前时间,那么命令的意思就是当前时间的24小时内。

Example 1:找出3天内被更动过的文件
[root@localhost ~]# find -mtime -3

我们看到find命令可以不用指定路径,而仅仅指定搜索的时间起始点。我们同样也可以指定查找的路径

Example 2:找出paul用户home目录下4天前被更动的文件
[root@localhost ~]# find /home/paul -mtime +4
/home/paul/.bash_profile
/home/paul/.gtkrc
/home/paul/.emacs
/home/paul/.zshrc
/home/paul/.bash_logout
/home/paul/.bashrc

Example 3:找出/home目录下属于paul用户的文件
[root@localhost ~]# find /home -user paul
/home/paul
/home/paul/.bash_profile
/home/paul/.gtkrc
/home/paul/.emacs
/home/paul/.zshrc
/home/paul/.bash_logout
/home/paul/.bash_history
/home/paul/.bashrc
[root@localhost ~]#

通过该命令我们可以轻松地找出所有我们想要的某个特定用户创建或拥有的文件。如果我们对某些文件比较怀疑(不明用户的文件),我们可以使用-nouser/-nogroup参数来搜索这些可疑文件
[root@localhost ~]# find / -nouser
find: /proc/
4369/task/4369/fd/4: 没有那个文件或目录
[root@localhost ~]#

Example 4:找出名为passwd的文件
[root@localhost ~]# find / -name passwd
/etc/pam.d/passwd
/etc/passwd

Example 5:找出大于1M的文件
[root@localhost ~]# find / -size +1000k
/sbin/lvm.static
/etc/gconf/schemas/metacity.schemas
/etc/gconf/schemas/apps_nautilus_preferences.schemas
/etc/gconf/schemas/gnome-terminal.schemas
/usr/sbin/winbindd
/usr/X11R6/lib/X11/doc/PostScript/XKBlib.ps
/usr/X11R6/lib/X11/doc/PostScript/dtprint_fspec.ps
/usr/X11R6/lib/libOSMesa.so
.4.0

Example 6:找出类型为socket的文件
[root@localhost ~]# find /var -type s
/var/run/iiim/.iiimp-unix/
9010
/var/run/dbus/system_bus_socket
/var/run/acpid.socket
/var/tmp/.oracle/sEXTPROC1
/var/tmp/.oracle/s#
6145.2
/var/tmp/.oracle/s#
6145.1
[root@localhost ~]#

Example 7:找出/home目录下用户paul的文件并显示详细属性
[root@localhost ~]# find /home -user paul -exec ls -l {} \;
总用量 0
-rw-r--r--  
1 paul paul 191 11月 22 23:19 /home/paul/.bash_profile
-rw-r--r--  
1 paul paul 120 11月 22 23:19 /home/paul/.gtkrc
-rw-r--r--  
1 paul paul 383 11月 22 23:19 /home/paul/.emacs
-rw-r--r--  
1 paul paul 658 11月 22 23:19 /home/paul/.zshrc
-rw-r--r--  
1 paul paul 304 11月 22 23:19 /home/paul/.bash_logout
-rw-------  
1 paul paul 300 12月 23 23:37 /home/paul/.bash_history
-rw-r--r--  
1 paul paul 124 11月 22 23:19 /home/paul/.bashrc
[root@localhost ~]#

上面的例子中,我们使用-exec参数,将搜索的结果放到{}中(其实这个位置就是平时我们使用ls命令的目录参数的位置嘛),至于\;则是转义字符,用来表示命令已经结束。由于;有特殊意义所以需要加斜杠来转义。

Example 8:使用通配符查找所有包含config的文件
[root@localhost ~]# find / -name *config -exec ls -l {} \;
-rwxr-xr-x  1 root root 9824 2004-09-27  /sbin/vconfig
-rwxr-xr-x  
1 root root 570048 2004-12-20  /sbin/ldconfig
-rwxr-xr-x  
1 root root 56204 2004-09-30  /sbin/ifconfig
-rwxr-xr-x  
1 root root 23600 2004-11-30  /sbin/iwconfig
-rwxr-xr-x  
1 root root 41136 2004-10-29  /sbin/chkconfig
-rwxr-xr-x  
1 root root 6608 2004-09-30  /sbin/plipconfig
-rw-r--r--  
1 root root 1196 2004-10-21  /etc/X11/xdm/xdm-config
总用量 
0


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-12-22 22:12 Paul Lin 阅读(690) 评论(0)  编辑  收藏 所属分类: Unix / Linux

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(19)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜