返回列表 發帖

三、尋找檔案或目錄

使用locate或slocate(有些版本Linux並沒有slocate指令)slocate:Security Enhanced version of the GNU Locate,有一些Linux版本並沒有slocate指令
locate:find files by name,Search for entries in a mlocate database.
如何知道locate及slocate有連結的關係呢?請特別注意並不是所有的版本都有slocate這個指令
方法一:
[root@pc tmp]# which locate               ->「which 指令」可以知道某個指令的絕對路徑
/usr/bin/locate
方法二:
[root@pc tmp]# ll `which locate`          ->「`」反單引號,可以想像指令中又有指令
locate的特性:
找路徑任何位置,所以出現符合資料有很多,從資料庫找,所以速度快,但從資料庫找有缺點,無法即時更新。例如,早上九點所新增的檔案,在十點使用locate尋找,可能找不到,因為已經錯過系統更新locate資料庫的時間了。
(上課練習)locate的Lab
[root@pc ~]# locate profile          ->找路徑內含有profile檔案或目錄,若無法找到時,請先手動更新mlocate database
[root@pc ~]# locate -i profile     ->「-i」大小寫不論,所以找到的筆數會比較多
請比較(1)(2)所出現的數字
(1)[root@pc ~]# locate profile | wc -l          (2)[root@pc ~]# locate -i profile | wc -l
locate是找路徑任何位置符合條件(搜尋字串)的檔案或目錄,所以實務上用的機會比較少
如何手動更新locate的資料庫?
系統預設在04:02會自動更新locate的資料庫(系統排程在/etc/cron.daily/*內),那如何手動更新locate的資料庫呢?
(上課練習)updatedb:update a database for mlocate
[root@pc ~]# updatedb &          ->『&』是背景執行,上課如果有必要手動更新時,最好背景執行
->並檢查硬碟燈是否亮著,系統預設每天早上04:02,執行「updatedb」,這個問題後面章節會教如何解決
(Home Work)which
which:shows the full path of (shell) commands.尋找某個執行檔(或某個指令)的絕對路徑
[root@pc ~]# which ls                    ->找到第一個符合就結束不找了
alias ls='ls --color=auto'
/bin/ls
(Home Work)whereis指令
whereis:locate the binary, source, and manual page files for a command
whereis的作用:顯示指令的二進碼、原始碼與線上man page的存放目錄
線上技術手冊通常放在「/usr/man」或「/usr/share/man」目錄中,如果想檢查實際存放的位置,則可以使用
「whereis 指令」或「whereis 檔案名稱」
常用的選項:
◎-b:只搜尋執行檔          ◎-m:只搜尋man page檔          ◎-s:只搜尋原始檔          ◎-u:搜尋不常用的文件
whereis查詢某個工具的所在位置
[root@pc ~]# whereis perl
perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz
[root@pc ~]# whereis -m perl
perl: /usr/share/man/man1/perl.1.gz               ->「-s」搜尋原始碼,「-m」搜尋說明,「-b」搜尋執行檔
練習如何利用whereis找某個檔案的man page,存放在那裏
(1)[root@pc ~]# whereis -m shadow               ->利用「whereis -m /etc/shadow」也可以找man page
  shadow: /usr/share/man/man3/shadow.3.gz /usr/share/man/man5/shadow.5.gz
(2)[root@pc ~]# man -aw shadow               ->這樣也可以找shadow的所有的man page
  /usr/share/man/man3/shadow.3.gz
/usr/share/man/man5/shadow.5.gz
通常,我們會透過「which」及「whereis」這二個搜尋指令工具,來尋找系統中指令存放位置
指令名稱:find
(上課練習)請先完成以下的練習,再來研究find
[root@pc ~]# touch /root/f1 /root/f2          ->產生/root下的f1及f2二個檔案
[root@pc ~]# touch /home/f1 /home/f2          ->產生/home下的f1及f2二個檔案
[root@pc ~]# touch /tmp/f1 /tmp/f2          ->產生/tmp下的f1及f2二個檔案
[root@pc ~]# find / -name f1               ->因為是從/根目錄開始找,所以速度比較慢
[root@pc ~]# find /home -name f1          ->指定只要找/home下的f1
[root@pc ~]# find /tmp -name f1               ->指定只要找/tmp下的f1
[root@pc ~]# find /home /tmp -name f1     ->要找/home及/tmp下的f1
[root@pc ~]# find -name f1                    ->沒有指定要找那一個目錄下的f1,會在目前的目錄裏面找
[root@pc ~]# find . -name f1               ->「.」表示在目前的目錄下找
檔案及目錄搜尋
在Linux中,其檔案系統是以階層式的(類似tree)架構組成,所以要在整個系統找某個特定的檔案或目錄並不是一件容易的事,可以利用「find」來解決問題。
缺點:
若由根目錄「/」開始尋找很浪費系統資源且費時,儘量利用空檔時間,以及縮小搜尋範圍,例如:只搜尋/home目錄下的檔案,以確保系統的效能。
在特定目錄下搜尋並顯示指定名稱的檔案和目錄,這是「find」指令最基本的功能,需要指定搜尋的目錄及關鍵字,若是沒有指定目錄,則系統會以目前的目錄為搜尋的範圍。
語法:
find dir1 dir2 dir3…cond1 cond2 cond3
目錄(或)       Condition條件關係是and(且)

[root@pc ~]# find . -name f2                    ->假設在root目錄下有f2檔案
[root@pc ~]# find /home -name f2               ->假設在/home目錄下有f2檔案
find比對路徑最後一段,locate是找路徑的任何地方
(1)[root@pc ~]# locate "*profile*"               
(2)[root@pc ~]# find / -name "*profile*"          ->請比較(1)(2)之間的差別
(3)[root@pc ~]# find / -iname "*profile*"          ->大小寫不論
結論:因為locate找路徑任何位置,而find找路徑最後的位置,所以locate出現的筆數比較多
[root@pc ~]# locate "*profile*" | wc -l          ->「wc -l」計算有多少行,也就是計算有多少行
651                                             ->因為locate是找路徑中的任何位置,所以出現筆數比較多
[root@pc ~]# find / -name "*profile*" | wc -l      但速度比較快,因為它從mlocate資料庫中找
275
[root@pc ~]# find /home -user mary          ->在/home目錄尋找,擁有者「mary」才符合
[root@pc ~]# find /home -group mary     ->在/home目錄尋找,群組是「mary」才符合
搜尋某時間內被存取、變更的檔案或目錄,要先了解什麼是「Access」、「Modify」、「Change」時間
-amin <分鐘>
(1)「-amin 10」                                   ->剛好在10分鐘以前有被存取過的檔案或目錄
(2)「-amin -10」                              ->在10分鐘內有被存取過的檔案或目錄
(3)「-amin +10」                              ->在超過10分鐘以前有被存取過的檔案或目錄
-atime <天數>,單位是24小時,例如<2>表示二天則代表是2X24小時,表示48小時
(1)「-atime 2」                                   ->剛好在48小時以前有被存取過的檔案或目錄
(2)「-atime -2」                                   ->在在48小時以內有被存取過的檔案或目錄
(3)「-atime +2」                              ->在超過二天48小時以前有被存取過的檔案或目錄
-cmin <分鐘>
(1)「-cmin 10」                                   ->剛好在10分鐘以前有被變更過的檔案或目錄
(2)「-cmin -10」                              ->在10分鐘內有被變更過的檔案或目錄
(3)「-cmin +10」                              ->在超過10分鐘以前有被變更過的檔案或目錄
-ctime <天數>,單位是24小時,例如<2>表示二天則代表是2X24小時,表示48小時
(1)「-ctime 2」                                   ->剛好在48小時以前有被變更過的檔案或目錄
(2)「-ctime -2」                                   ->在在48小時以內有被變更過的檔案或目錄
(3)「-ctime +2」                              ->在超過二天48小時以前有被變更過的檔案或目錄
mtime n: 用檔案修改時間(modification)為搜尋條件,n以24小時為週期。
Lab:
[root@pc tmp]# find /home -amin -3          ->三分鐘內存取過的檔案或目錄
[root@pc tmp]# find /home -atime -3          ->三天內存取過的檔案或目錄
[root@pc tmp]# find /home -cmin -3          ->三分鐘內變更過的檔案或目錄
[root@pc tmp]# find /home -ctime -3          ->三天內變更過的檔案或目錄
進階的練習:如何在某特定的目錄內,找在特定天數內未曾更動的檔案,並同時刪除
[root@pc tmp]# find . -atime +3 -exec rm -fr {} \;          ->在/tmp目錄內,超過三天已Access的物件刪除
(上課練習)如何在某個目錄內找空檔案,找到時同時刪除
[root@pc tmp]# touch test.f1 test.f2 test.f3               ->先產生三個空白檔案,以便練習
[root@pc tmp]# ls                                   ->檢查是否新增成功
456  chkroot.txt  test.f1  test.f2  test.f3
[root@pc tmp]# find /tmp -empty | xargs rm -fr     ->「-empty」找到空白時,並刪除
[root@pc tmp]# ls                                   ->檢查是否成功移除空白檔案
456  chkroot.txt
搜尋特定大小的檔案
參數「-size」可以指定搜尋檔案的大小
「1024」                                        ->find指令會搜尋大小是=1024 Blocks檔案
「+1024」                                        ->find指令會搜尋大小是>1024 Blocks檔案
「-1024」                                        ->find指令會搜尋大小是<1024 Blocks檔案
(1)加「b」表示以Block(512Bytes)為單位,這也是系統預設值
(2)加「c」表示以Byte為單位,(3)加「w」表示以2個Bytes為單位,(4)加「k」表示以Kbytes為單位
[root@pc tmp]# find / -size +100k -print     ->表示找檔案大小>100KB的檔案
老師說明:
find的功能
(1)可以找到user或group的檔案(2)可以以日期或時間為條件來找(3)可以以特定字串來找檔案(4)可以檔案的大小來找(5)也可以配合-perm來找權限
[root@pc tmp]# ls -lR /home及[root@pc tmp]# find /home -print都一樣的結果

(上課練習)find與-exec結合的練習,某人離職後,將此人在其它目錄內的物件一併刪除
在root的畫面       在mary的畫面
1.[root@pc ~]# grep mary /etc/passwd
->先檢查是否有mary這個帳號,如果沒有請自行產生
9.[root@pc ~]# grep mary /etc/passwd
mary:x:10041:10041::/home/mary:/bin/bash
10.[root@pc ~]# userdel -r mary
->刪除某個使用者,加「-r」連他的home dir也刪除,及尚未取回的信件/var/spool/mail/mary也會刪除
11.[root@pc ~]# ll /home/mary
ls: /home/mary: No such file or directory
->應該找不到她的家目錄了
12.[root@pc ~]# ll /tmp
->但她在/tmp內的物件還存在
13.[root@pc ~]# find / -uid 10041 -exec rm -fr {} \;
14.root@pc ~]# ll /tmp          ->應該沒有mary的東西了       2.[root@pc ~]# su - mary          ->切換成mary身份
3.[mary@pc ~]$ touch f1 f2
->在她的家目錄內產生f1及f2二個檔案
4.[mary@pc ~]$ touch /tmp/mary.f1
5.[mary@pc ~]$ touch /tmp/mary.f2
6.[mary@pc ~]$ mkdir /tmp/mary.d1
7.[mary@pc ~]$ mkdir /tmp/mary.d2
->4、5、6、7在其它目錄,mary產生檔案或目錄
->善用方向鍵<||>,再做局部修改比較快
->假設mary習慣不良,在其它目錄下產生物件,如果她離職後,怎麼辦?
8.按「Ctrl + D」mary先退出來
->13條件要「-uid」了,因為mary帳號已經移除了
如何找到某個指定權限,並同時換成其它的權限?
在find指令中支援「-perm」參數,它可以用搜尋符合指定權限數值的檔案或目錄,可以找到符合權限並且將它們刪除
[root@pc ~]# cd /tmp                                             ->切換到/tmp,以便練習
[root@pc ~]# rm -fr *                                        ->刪除/tmp內所有的物件,以便練習
[root@pc tmp]# touch f1 f2 f3                                   ->產生三個空白檔案,以便練習
[root@pc tmp]# ll                                             ->檢查是否新增成功
[root@pc tmp]# chmod 777 f1                                   ->將f1檔案的權限改成777
[root@pc tmp]# find /tmp -perm 777 -exec chmod 600 {} \;     ->找權限是777的物件,並改成600,{}中間不能有空白
[root@pc tmp]# ll                                             ->檢查是否改變成功
搜尋特定檔名並且刪除
系統使用久了,難免會有一些不再需要的檔案,我們不太可能一個一個目錄裏裏找,然後刪除,可以利用find配合-exec方式刪除不必要的檔案
[root@pc ~]# touch /var/test.java                                   ->先產生一個/var/test.java檔案
[root@pc ~]# ll /var/test.java                                   ->檢查是否有test.java檔案
-rw-r--r-- 1 root root 0 Mar 23 01:31 /var/test.java
[root@pc ~]# find / -name test.java -exec rm -fr {} \;          ->{}中間不能有空白,系統看到「\;」就結束動作
[root@pc ~]# ll /var/test.java                                   ->刪除後就找不到了
ls: /var/test.fava: No such file or directory
搜尋空白檔案並刪除
我們在練習時,常常利用touch指令產生一些空白檔案,可以利用find配合-exec來快速刪除,但/etc目錄裏面有一些系統預設就是空白的檔案,最好不要隨便刪除
Unix:[root@pc tmp]# find . -empty | xargs rm -fr
Linux:[root@pc tmp]# find . -empty -exec rm {} \;
->其中的大括號{}表示所有搜尋的結果,{}中間不能空白,最後記得使用「-exec」選項後須以「\;」來作結尾

返回列表
清潔達人-家管服務-洗地打蠟-專業收納-行李打包-台北清潔公司-洗地打蠟-專業收納-新北市清潔公司-家事服務-專業收納-居家清潔公司-家庭清潔打掃-台北清潔公司-居家清潔-地毯及沙發清潔保養-專業收納-清潔公司-愛乾淨清潔公司-家事服務-到府打掃-居家服務
1155