站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

Unit13-Finding and Processing Files

前言

在 Linux 下搜尋檔案資源時常用的 4 個指令

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 也配合下列參數來過濾出更精準的條件: (可配合正規表示式)

下列操作練習為當系統在 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 來過濾指定的條件,但若混合使用時其先後順序及相對應的參數如下:

 find DIR 條件1 -and|-a|不寫也可 條件2
 find DIR -not|! 條件
 find DIR 條件1 -or|-o 條件2

find and access times

每個檔案或資料夾其實都有 3 個時間標籤也就是 atime、mtime、ctime,預設時間顯示 mtime (ex. ls -l)

find basic and permissions and numeric criteria

以下為常用來配合 find 指令的搜尋條件參數:

-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 檔案閱讀內容
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com