創造性地使用 find
您可以使用find
命令執行各種各樣的任務。本部分內容提供了使用find
命令來管理檔案系統的幾種方式的示例。
為了保持簡單,這些示例都避免了使用涉及通過管道將乙個命令的輸出傳遞到另乙個命令的-exec
命令。然而,您完全可以根據自己需要在 find 命令的-exec
子句中使用這樣的命令。
清除臨時檔案
您可以使用find
命令來清除目錄或子目錄中在正常使用過程中生成的臨時檔案,這樣可以節省磁碟空間。要實現該操作,請使用下面的命令:
$ find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm {} \;
括號中的檔案掩碼 標識出了需要刪除的檔案型別,每個檔案掩碼的前面都有-name.
該列表可以擴充套件為包括您需要清除的系統中的任何臨時檔案型別。在**的編譯和連線過程中,程式設計師及其工具會生成示例中的那些檔案型別:a.out, *.o
和core.
其他的使用者通常也會生成類似的臨時檔案,可以使用如*.tmp, *.junk
等檔案掩碼來對命令進行相應的編輯。您可能還發現將命令放入乙個稱作clean
的指令碼中非常有用,當需要清除乙個目錄中的內容的時候就可以執行該指令碼。
複製目錄中的內容
find
命令允許您複製目錄中的全部內容,同時保持每個檔案和子目錄的許可權、時間和所有權。要完成該操作,需要組合使用find
和cpio
命令,如下所示:
清單 2. 組合使用 find 和 cpio 命令
$ cd /path/to/source/dir$ find . | cpio -pdumv /path/to/destination/dir
cpio命令
是乙個複製命令,它設計用來將檔案複製到或複製出乙個 cpio 或 tar 存檔檔案,並自動地保持檔案和子目錄的許可權、時間和所有權。
列出文字檔案的第一行內容
有些人使用每個文字檔案的第一行作為標題或者檔案內容的描述。可以使用列出檔名和所有文字檔案第一行內容的報表更方便地對大量的文字檔案進行篩選。下面的命令在報表中列出了您的 home 目錄中所有文字檔案的第一行內容,便於進一步地根據需要使用less
命令進行檢查:
清單 3. less 命令
$ find $home/. -name *.txt -exec head -n 1 -v {} \; > report.txt$ less < report.txt
維護 log 和 tmp 檔案的儲存空間
要為生成大量檔案的應用程式維護 log 和 tmp 檔案儲存空間,可以將下列命令放入到每天執行的cron
任務中:
清單 4. 維護 log 和 tmp 檔案儲存空間
$ find $logdir -type d -mtime +0 -exec compress -r {} \;$ find $logdir -type d -mtime +5 -exec rm -f {} \;
第乙個命令找到 $logdir 目錄中所有包含在 24 小時內(-mtime +0)
進行了修改的資料的目錄(-type d), 對它們進行壓縮(compress -r {})
以節省磁碟空間。如果這些目錄超過了乙個工作周(-mtime +5)
,第二個命令則將其刪除(rm -f {})
,以便增加磁碟上的可用空間。通過這種方式,cron 任務自動地根據您所指定的時間視窗對目錄進行維護。
複製複雜的目錄樹
如果您想要將複雜的目錄樹從一台計算機複製到另一台計算機,同時保持副本許可權以及 user id 和 group id(uid 和 gid——作業系統所使用的標記檔案的所有權的數值),並且不複製使用者檔案,那麼就需要再次使用find
和cpio;
清單 5. 複製複雜的目錄樹
$ cd /source/directory$ find . -depth -print | cpio -o -o /target/directory
查詢不指向任何地方的鏈結
要查詢不指向任何地方的鏈結,可以使用帶find
的perl
直譯器,如下所示:
$ find / -type l -print | perl -nle '-e || print';
該命令從最頂層目錄 (/) 開始,列出由perl
直譯器確定不指向任何地方(-nle '-e || print')
的所有鏈結(-type l -print)
,關於 unix guru universe 站點中這個技巧的更詳細的資訊,請參閱參考資料
部分。如果您想要刪除這些檔案,可以進一步使用管道將輸出傳遞到rm -f {}
命令。當然,perl 可以在大多數的 unix 工具包中找到,它是許多功能強大的解釋性語言工具中的一種。
定位和重新命名無法列印的目錄
在 unix 中,可能會有錯誤的或惡意的程式建立包含無法列印的字元的目錄。定位和重新命名這些目錄,這樣就可以更容易地檢查並刪除它們。要完成該操作,您首先需要在ls
中包含-i
開關,以獲取該目錄的索引節點的數值。然後,使用find
將索引節點的數值轉換為乙個可以使用mv
命令進行重新命名的檔名:
清單 6. 定位和重新命名無法列印的目錄
$ ls -ail$ find . -inum 211028 -exec mv {} newname.dir \;
列出長度為零的檔案
要列出所有長度為零的檔案,請使用下面的命令:
$ find . -empty -exec ls {} \;
在查詢到空檔案之後,您可以選擇用rm
命令來代替ls
命令,以刪除這些檔案。
很明顯,您對 unixfind
命令的使用受到知識和創造性的限制。
結束語
linux之find命令詳解
查詢檔案 find type f 查詢目錄 find type d 查詢名字為test的檔案或目錄 find name test 查詢名字符合正規表示式的檔案,注意前面的 查詢到的檔案帶有目錄 find regex so.gz 查詢目錄並列出目錄下的檔案 為找到的每乙個目錄單獨執行ls命令,沒有選項...
linux之find命令詳解
參考 查詢檔案 find type f 查詢目錄 find type d 查詢名字為test的檔案或目錄 find name test 查詢名字符合正規表示式的檔案,注意前面的 查詢到的檔案帶有目錄 find regex so.gz 查詢目錄並列出目錄下的檔案 為找到的每乙個目錄單獨執行ls命令,沒...
linux之find命令詳解
查詢檔案 find type f 查詢目錄 find type d 查詢名字為test的檔案或目錄 find name test 查詢名字符合正規表示式的檔案,注意前面的 查詢到的檔案帶有目錄 find regex so.gz 查詢目錄並列出目錄下的檔案 為找到的每乙個目錄單獨執行ls命令,沒有選項...