︿
Top

前言

在 Linux 下搜尋檔案資源時常用的 4 個指令:
  • locate:快,不精準。
  • find:慢,可支援多種組合條件。
  • which:透過環境變數 $PATH 去尋找。
  • whereis


locate

locate 為利用 Database 儲存所有目錄及檔案所以搜尋速度非常快,但缺點是其 Database 為定時更新,所以若在此期間新增的檔案或資料夾將無法搜尋到,從下列操作中我們可了解到 locate 的 Database 為每日凌晨 4:02 進行更新,更新指令為 /usr/bin/updatedb,所以若更新時間未到而您想 手動更新 的話也可自行執行 updatedb 指令來更新 locate 的 Database (重建 Database 約 5 ~ 10 分鐘並依系統效能而有所不同)。
cat /etc/crontab  |grep daily
 02 4 * * * root run-parts /etc/cron.daily
ls -R /etc/cron.daily/ |grep locate
 mlocate.cron
cat /etc/cron.daily/mlocate.cron
 #!/bin/sh
 nodevs=$(< /proc/filesystems awk '$1 == "nodev" { print $2 }')
 renice +19 -p $$ >/dev/null 2>&1
 /usr/bin/updatedb -f "$nodevs"

locate 也配合下列參數來過濾出更精準的條件: (可配合正規表示式)
  • -i: 忽略大小寫。
  • -n X: 顯示前 X 筆記錄。
  • -e DIR: 忽略指定的資料夾。

下列操作練習為當系統在 locate 的 Database 尚未進行更新時新增一個名為 weithenn.pdf 的檔案,這時使用 locate 指令去尋找該檔案是找不到的 (直接還給您提示字元),此時使用指令 updatedb 去手動更新 locate 的 Database 後再次尋找 weithenn.pdf 檔案便可尋找的到。
touch weithenn.pdf    //新增檔案
locate weithenn.pdf   //搜尋檔案
#                        //找不到檔案還給您提示字元 (因為 locate 的 Database 尚未更新)
updatedb               //手動更新 locate 的 Database
locate weithenn.pdf   //再次搜尋便可找到檔案
 /root/test/weithenn.pdf




find

find 跟 locate 比起來雖然搜尋速度較慢,但可配合的搜尋條件較 locate 多所以若好好運用也可以有效縮短搜尋時間。

find and logical operators

find 可配合 AND、NOT、OR 來過濾指定的條件,但若混合使用時其先後順序及相對應的參數如下:

AND (Default)
 find DIR 條件1 -and|-a|不寫也可 條件2
NOT
 find DIR -not|! 條件
OR
 find DIR 條件1 -or|-o 條件2

find and access times

每個檔案或資料夾其實都有 3 個時間標籤也就是 atime、mtime、ctime,預設時間顯示 mtime (ex. ls -l)。
  • atime: Access-time 也就是該檔案或資料夾被 閱讀或存取 的時間。
  • mtime (Default): Modification-time 也就是該檔案或資料夾被 改變內容 的時間。
  • ctime: Change-time 也就是該檔案 inode 被改變的時間,例如 chmod。

find basic and permissions and numeric criteria

以下為常用來配合 find 指令的搜尋條件參數:
  • -name: 指定搜尋條件名稱,例如 bear.jpg、*.txt、*pass*。
  • -iname: 指定的搜尋條件名稱忽略大小寫。
  • -user、-group: 指定搜尋條件是某個使用者及群組。
  • -uid、-gid: 指定搜尋條件是某個 UID 及 GID。
  • -perm: 指定搜尋條件的權限設定,例如 755 (權限為 rwxr-xr-x)。
  • -type: 指定搜尋條件為目錄 (d) 或檔案 (f)。
  • -size: 指定搜尋條件的大小,例如 10k (等於 10KB)、+10M (大於 10MB)、-10G (小於 10GB)。
  • -amin、-mmin、cmin: 指定搜尋條件的相關時間,例如 10 (等於 10 分)、+10 (多 10 分)、-10 (少 10 分)。
  • -atime、-mtime、ctime: 指定搜尋條件的相關時間,例如 10 (等於 10 天)、+10 (多 10 天)、-10 (少 10 天)。

找到搜尋條件後執行,可配合 {} 符號表示找到的所有條件,最後使用 空格\; 來結尾整個搜尋指令
  • -exec: 找到指定的搜尋條件後 馬上執行
  • -ok: 找到指定的搜尋條件時 確認後才執行

-name、-iname 練習

touch bear.jpg           //建立檔案
touch BeAr.jpg           //建立檔案
find -name bear.jpg    //搜尋檔案名稱為 bear.jpg
 ./bear.jpg
find -iname bear.jpg   //搜尋檔案名稱為 bear.jpg 但忽略大小寫
 ./bear.jpg
 ./BeAr.jpg
find -name "*bear*"    //搜尋檔案名稱中間含有 bear 字元
 ./bear.jpg
find -iname "*bear*"   //搜尋檔案名稱中間含有 bear 字元但忽略大小寫
 ./bear.jpg
 ./BeAr.jpg


-user、-group 練習

ll                                  //顯示檔案資訊
 total 8
 -rw-r--r-- 1 root root 0 Sep 12 11:59 bear.jpg
 -rw-r--r-- 1 root root 0 Sep 12 11:59 BeAr.jpg
chown weithenn:chris BeAr.jpg  //修改檔案擁有者及郡組
ll
 total 8
 -rw-r--r-- 1 root     root  0 Sep 12 11:59 bear.jpg
 -rw-r--r-- 1 weithenn chris 0 Sep 12 11:59 BeAr.jpg
find -user root                  //搜尋目前目錄中使用者為 root 的檔案
 ./bear.jpg
find -user weithenn              //搜尋目前目錄中使用者為 weithenn 的檔案
 .
 ./BeAr.jpg
find -group weithenn             //搜尋目前目錄中群組為 weithenn 的檔案(找不到直接還提示字元)
find -group chris                //搜尋目前目錄中群組為 chris 的檔案
 ./BeAr.jpg


-perm、AND、NOT、OR 練習

find -perm 644                     //搜尋目前目錄中權限為 644
 ./bear.jpg
 ./BeAr.jpg
find -perm 644 -name bear.jpg   //搜尋目前目錄中權限為 644 且名稱為 bear.jpg (AND)
 ./bear.jpg
chmod 755 bear.jpg                //改變檔案權限
find -perm 644 -name bear.jpg   //搜尋目前目錄中權限為 644 或名稱為 bear.jpg (OR)
find -perm 644 -or -name bear.jpg
 ./bear.jpg                           //符合第 2 個條件 (-name bear.jpg)
 ./BeAr.jpg                            //符合第 1 個條件 (-perm 644)
find -perm 644 -not -name bear.jpg    //搜尋目前目錄中權限為 644 但名稱不是 bear.jpg
 ./BeAr.jpg
touch f{111,222,333,444,555,666,777}  //建立名稱為 111 ~ 777 的空檔案
for i in $(seq 111 111 777); do chmod ${i} f${i};done //依序設定檔案111權限111、檔案222權限222(透過迴圈達成)
ls -al
 total 44
 drwxr-xr-x  2 weithenn root 4096 Sep 12 12:54 .
 drwxr-x--- 18 root     root 4096 Sep 12 11:54 ..
 ---x--x--x  1 root     root    0 Sep 12 12:54 f111
 --w--w--w-  1 root     root    0 Sep 12 12:54 f222
 --wx-wx-wx  1 root     root    0 Sep 12 12:54 f333
 -r--r--r--  1 root     root    0 Sep 12 12:54 f444
 -r-xr-xr-x  1 root     root    0 Sep 12 12:54 f555
 -rw-rw-rw-  1 root     root    0 Sep 12 12:54 f666
 -rwxrwxrwx  1 root     root    0 Sep 12 12:54 f777
find -perm 755        //搜尋目前目錄中權限為 755 (目錄本身符合此條件)
 .
find -perm +222       //搜尋目前目錄中 anyone 權限具有寫入 w (含目錄本身)
 .
 ./f333
 ./f222
 ./f666
 ./f777
find -perm -222       //搜尋目前目錄中 everyone 權限具有寫入 w (不含目錄本身)
 ./f333
 ./f222
 ./f666
 ./f777
find -perm -002       //搜尋目前目錄中 other 權限具有寫入 w
 ./f333
 ./f222
 ./f666
 ./f777

-exec、-ok、{}、\; 練習

find -perm -002 -exec chmod o-w {} \;  //搜尋目前目錄中other權限具有寫入w並將搜尋到的檔案其寫入w權限移除
ll
 total 28
 ---x--x--x 1 root root 0 Sep 12 12:54 f111
 --w--w---- 1 root root 0 Sep 12 12:54 f222 //other 的 w 被拿掉
 --wx-wx--x 1 root root 0 Sep 12 12:54 f333 //other 的 w 被拿掉
 -r--r--r-- 1 root root 0 Sep 12 12:54 f444
 -r-xr-xr-x 1 root root 0 Sep 12 12:54 f555
 -rw-rw-r-- 1 root root 0 Sep 12 12:54 f666 //other 的 w 被拿掉
 -rwxrwxr-x 1 root root 0 Sep 12 12:54 f777 //other 的 w 被拿掉
find -perm -020 -ok chmod o+w {} \;   //搜尋目前目錄中 other 權限具有寫入 w 並將搜尋到的檔案經詢問後決定其寫入 w 權限是否移除
 < chmod ... ./f333 > ? y   //回答 y 則將 other 權限加入寫入 w
 < chmod ... ./f222 > ? n   //回答 n 則不將 other 權限加入寫入 w
 < chmod ... ./f666 > ? y
 < chmod ... ./f777 > ? n
ll
 total 28
 ---x--x--x 1 root root 0 Sep 12 12:54 f111
 --w--w---- 1 root root 0 Sep 12 12:54 f222
 --wx-wx-wx 1 root root 0 Sep 12 12:54 f333 //回答 y 則將 other 權限加入寫入 w
 -r--r--r-- 1 root root 0 Sep 12 12:54 f444
 -r-xr-xr-x 1 root root 0 Sep 12 12:54 f555
 -rw-rw-rw- 1 root root 0 Sep 12 12:54 f666 //回答 y 則將 other 權限加入寫入 w
 -rwxrwxr-x 1 root root 0 Sep 12 12:54 f777


-type 練習

find /home -type d                        //搜尋 /home 下所有資料夾
 /home
 /home/chris
 /home/chris/.mozilla
 /home/chris/.mozilla/extensions
 /home/chris/.mozilla/plugins
 /home/weithenn
 /home/weithenn/.mozilla
 /home/weithenn/.mozilla/extensions
 /home/weithenn/.mozilla/plugins
find /home -type f                        //搜尋 /home 下所有檔案
 /home/chris/.lesshst
 /home/chris/.bashrc
 /home/chris/.bash_profile
 /home/chris/.bash_history
 /home/chris/.emacs
 /home/chris/.bash_logout
 /home/weithenn/.bashrc
 /home/weithenn/.bash_profile
 /home/weithenn/.bash_history
 /home/weithenn/.emacs
 /home/weithenn/.bash_logout
find /home -type f -ls
 3571732    8 -rw-------   1 chris    sales          35 Aug 13 09:09 /home/chris/.lesshst
 3571723    8 -rw-r--r--   1 chris    chris         124 Aug 13 08:42 /home/chris/.bashrc
 3571724    8 -rw-r--r--   1 chris    chris         176 Aug 13 08:42 /home/chris/.bash_profile
 3571731    8 -rw-------   1 chris    sales         164 Sep  5 12:31 /home/chris/.bash_history
 3571728    8 -rw-r--r--   1 chris    chris         515 Aug 13 08:42 /home/chris/.emacs
 3571729    8 -rw-r--r--   1 chris    chris          33 Aug 13 08:42 /home/chris/.bash_logout
 3571715    8 -rw-r--r--   1 weithenn weithenn      124 Aug  3 09:40 /home/weithenn/.bashrc
 3571716    8 -rw-r--r--   1 weithenn weithenn      176 Aug  3 09:40 /home/weithenn/.bash_profile
 3571730    8 -rw-------   1 weithenn weithenn      119 Aug 13 10:14 /home/weithenn/.bash_history
 3571720    8 -rw-r--r--   1 weithenn weithenn      515 Aug  3 09:40 /home/weithenn/.emacs
 3571721    8 -rw-r--r--   1 weithenn weithenn       33 Aug  3 09:40 /home/weithenn/.bash_logout


-size 練習

dd if=/dev/zero of=./1K bs=1K count=1      //以dd指令建立名為1K大小為1KB的檔案
dd if=/dev/zero of=./7K bs=1K count=7      //以dd指令建立名為7K大小為7KB的檔案
dd if=/dev/zero of=./1M bs=1M count=1      //以dd指令建立名為1M大小為1MB的檔案
dd if=/dev/zero of=./5M bs=1M count=5      //以dd指令建立名為5M大小為5MB的檔案
ll -h
 total 6.1M
 -rw-r--r-- 1 root root 1.0K Sep 13 09:56 1K
 -rw-r--r-- 1 root root 1.0M Sep 13 09:57 1M
 -rw-r--r-- 1 root root 5.0M Sep 13 09:57 5M
 -rw-r--r-- 1 root root 7.0K Sep 13 09:57 7K




補充 1. 如何將 Man 手冊轉換為 PDF 方便列印閱讀

相信很多人跟我一樣不太喜歡一直盯著螢幕看手冊,所以您可透過下列指令將預設 man 查詢到的指令手冊轉換成 PDF 檔案及而列印出來閱讀。
man -t find > find.ps    //將 find 指令手冊內容寫入至 find.ps
ps2pdf find.ps find.pdf  //將 find.ps 轉換為 find.pdf
evince find.pdf &        //若在 init 5 下可執行此指令直接打開 PDF 檔案閱讀內容
文章標籤: