【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
/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





可以看到,由于root用戶和paul用戶的PATH變量的設置不同,而ifconfig命令由僅存在于sbin目錄下,所以paul用戶執行which ifconfig時找不到該命令
【2.whereis和locate命令】
和which命令不同,whereis和locate命令可以搜索除了PATH變量指定路徑下的其它目錄和文件。先看下面的例子:
Example 1:使用root用戶身份查找名為mount的文件






Example 2:使用paul用戶身份查找名為mount的文件





我們看到,不論是以root身份還是以paul身份,whereis命令都可以找到名為mount的命令,而且搜索的結果中既包含了位于PATH變量指定的路徑下,也包含了其它不在PATH變量中指定路徑下的文件。
其次我們看到如果加上-b參數,搜索結果會不一樣。這是因為-b參數是用于搜索二進制文件的(即可執行文件)。所以我們也可以用-b參數來縮小搜索結果范圍
Example 3:使用locate命令來查找mount文件




很奇怪,系統居然提升我們找不到一個名為/var/lib/slocate/slocate.db的東東,而且要我們先執行一個updatedb的命令!這是為什么?
原因是因為locate命令的查找機制不是直接從硬盤中逐個搜索,比較文件。而是去搜索一個類似于“目錄索引”的文件,該文件就像書的目錄一樣指向硬盤上的各個文件。
那么該索引文件又是哪里來的?答案就是通過updatedb創建,該命令會讀取/etc/updatedb.conf文件,確定該索引文件的創建,更新機制。見下圖



如果我們把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小說被改動過的文件

參數0是什么意思呢?其實0表示當前時間,那么命令的意思就是當前時間的24小時內。
Example 1:找出3天內被更動過的文件

我們看到find命令可以不用指定路徑,而僅僅指定搜索的時間起始點。我們同樣也可以指定查找的路徑
Example 2:找出paul用戶home目錄下4天前被更動的文件







Example 3:找出/home目錄下屬于paul用戶的文件










通過該命令我們可以輕松地找出所有我們想要的某個特定用戶創建或擁有的文件。如果我們對某些文件比較懷疑(不明用戶的文件),我們可以使用-nouser/-nogroup參數來搜索這些可疑文件



Example 4:找出名為passwd的文件



Example 5:找出大于1M的文件












Example 6:找出類型為socket的文件








Example 7:找出/home目錄下用戶paul的文件并顯示詳細屬性










上面的例子中,我們使用-exec參數,將搜索的結果放到{}中(其實這個位置就是平時我們使用ls命令的目錄參數的位置嘛),至于\;則是轉義字符,用來表示命令已經結束。由于;有特殊意義所以需要加斜杠來轉義。
Example 8:使用通配符查找所有包含config的文件












-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。