前言
在 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 檔案閱讀內容