除了在一個目錄結構下查找文件這種基本的操作,你還可以用find命令實現一些實用的操作,使你的命令列之旅更加簡易。
本文將介紹15種無論是於新手或老鳥都非常有用的Linux find指令。
首先,在你的home目錄下面建立下面的空文件,來測試下面的find指令範例。
01 # vim create_sample_files.sh
02 touch MybashProgram.sh
03 Program.c 05 touch Program.c 06 07 mk09
10 touch MybashProgram.sh
11 touch mycprogram.c touch Program.c
14
15 # chmod +x create_sample_files.sh
16 ./create_sample_files.sh 18 19 # ls -R 20 .: MybashProgram.sh MyCProgram.c 22 create_sample_files.sh mycprogram.c backup: 25 MybashProgram.sh mycprogram.c MyCProgram.c Program.c 1. 基本使用檔案名稱來找出檔案這是一個基本用法指令的一個基本用法。下面的範例展示了以MyCProgram.c作為查找名在目前目錄及其子目錄中尋找檔案的方法。 1 # find -name "MyCProgram.c" 2 ./backup/MyCProgram.c 3 ./找出CProgram.c My3 ind命令的一個基本用法。下面的範例展示了以MyCProgram.c作為查找名在目前目錄及其子目錄中尋找檔案的方法,忽略了大小寫。 1 # find -iname "MyCProgram.c" 2 ./mycprogram.c 3 遠 5 ./MyCProgram.c 3. 使用mindepth和maxdepth限定搜尋指定目錄的深度在root目錄及其子目錄下尋找passwd檔案。 1 # find / -name passwd1 # find / -name passwd
2 ./usr/share/doc/nss_ldap-253/pam.d/passwd
./etc/pam.d/密碼-name passwd 2 ./etc/passwd 在root目錄下及其最大兩層深度的子目錄中尋找passwd檔案. (例如root — level 1, and two sub-directories — level 2.1 # find / -maxdepth 3 -name passwd
2 ./usr/bin/passwd
3 .
在第二層子目錄和第四層子目錄之間找passwd檔。
1 # find -mindepth 3 -maxdepth 5 -name passwd
2 ./usr/bin/passwd
.的文件上執行指令下面的例子展示了find指令來計算所有不區分大小寫的檔案名為「MyCProgram.c」的檔案的MD5驗證和。 {}將會被目前檔案名稱取代。 1 find -iname "MyCProgram.c" -exec md5sum {} ; 2 d41d8cd98f00b204e9800998 d41d8cd98f00b204e9800998.ecf d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c 4 d41d8cd98f00b4 Myd41d8cd98f00b4 ”5 d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
5. 相反符合
顯示所有的名字不是MyCProgram.c的檔案或目錄。由於maxdepth是1,所以只會顯示目前目錄下的檔案和目錄。
1 find -maxdepth 1 -not -iname "MyCProgram.c"
2 .
3 ./MybashProgram.sh
4 ./create_sample_files.sh
Program.c 6. 使用inode編號找出檔案任何一個檔案都有一個獨一無二的inode編號,藉此我們可以區分文件。建立兩個名字相似的文件,例如一個有空格結尾,一個沒有。 1 touch "test-file-name"1 touch "test-file-name"
2
3 # touch "test-file-name " Not
5 6 # ls -1 test* 7 test-file-name 8 test-file-name 從ls的輸出無法區分哪個檔案有空格結尾。使用選項-i,可以看到檔案的inode編號,藉此可以區分這兩個檔案。 1 ls -i1 test* 2 16187429 test-file-name 3 inode編號。在此,find指令用inode編號重新命名了一個檔案。 1 find -inum 16187430 -exec mv {} new-test-file-name ; 2430 new-test-file-name
5 16187429 test- file-name
你可以在你想對那些像上面一樣的糟糕命名的檔案做某些操作時使用這項技術。例如,名為file?.txt的檔案名稱中有一個特殊字元。若你想執行“rm file?.txt”,下面所示的所有三個檔案都會被刪除。所以,採用下面的步驟來刪除"file?.txt"檔案。 1 ls 2 file1.txt file2.txt file?.txt 找到每個檔案的每個檔案編號。 1 ls -i1
2 804178 file1.txt
3 804179
3 804179
3 804179 txt
如下圖所示: 使用inode編號來刪除那些有特殊符號的檔案名稱。
1 find -inum 804180 -exec rm {} ;
2
3
5 [Note: The file with name "file?.txt" is now removed] 7. 根據文件權限查找文件下面的操作時合理的:找到具有指定權限的文件忽略其他權限位,檢查是否和指定權限匹配根據給定的八進制/符號表達的權限搜尋此例中,假設目錄包含以下檔案。注意這些文件的權限不同。 1 ls -l 2 total 0 3 -rwxrwxrwx 13 -rwxrwxrwx 1 -rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
5 ---------- 1 root root 0 2009-02-19 20:31 no_for_all
6 20:31 no_for_all
6 19 20:29 ordinary_file
7 -rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read -19 20:27 others_can_only_read
找到具有群組讀取權限的檔案。使用下面的命令來找到當前目錄下對同組用戶具有讀取權限的文件,忽略該文件的其他權限。
1 find . -perm -g=r -type f -exec ls -l {} ;
2 -rw-r--r-- 1 根
3 -rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all 4 ----r----- 1 root root 0 205 5 -rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read 找到對群組使用者俱有唯讀權限的檔案。 1 find . -perm g=r -type f -exec ls -l {} ; 2 ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read找到對群組使用者俱有唯讀權限的檔案(使用八進位權限形式)。 1 find . -perm 040 -type f -exec ls -l {} ; 2 ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read 8 . 找到home目錄及子目錄下所有的空檔(0位元組檔案)
下面指令的輸出檔絕大多數都是鎖定檔案盒其他程式所建立的place hoders
1 find ~ -empty
只列出你home目錄裡的空白檔案。
1 find . -maxdepth 1 -empty
只列出當年目錄下的非隱藏式空白檔案。
1 find . -maxdepth 1 -empty -not -name ".*"
9. 找出5個最大的檔案
下面的指令列出目前目錄及子目錄下的5個最大的檔案。這會需要一點時間,取決於命令需要處理的檔案數量。
1 find . -type f -exec ls -s {} ; | sort -n -r | head -5
10. 求出5個最小的檔案
5個相同的檔案sort的順序是降序。 1 find . -type f -exec ls -s {} ; | sort -n | head -5 上面的指令中,且有可能你看到的只是檔案(0位元組)。如此,你可以使用下面的命令列出最小的文件,而不是0位元組文件。 1 find . -not -empty -type f -exec ls -s {} ; | sort -n | head -5 11。 find . -type s 找出所有的目錄1 find . -type d 找出所有的一般檔案1 1
1 find . -type f - name ".*" 查找所有隱藏的目錄1 find -type d -name ".*" 12. 透過和其他文件比較修改時間來尋找文件來修改文件顯示。下面的find指令將顯示所有的在ordinary_file之後會建立修改的檔案。 01 ls -lrt 02 total 0 03 -rw-r----- 1 root root0200904 ----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
05 -rw------- 1 root root 0 2009-02-19 20:29 ordinary_root root 1 root root 0 2009-02-19 20:30 everybody_read
07 -rwxrwxrwx 1 root root 0 2009-02 -19 20:31 no_for_all
09
10 # find -newer ordinary_file
11 . 13 ./all_for_all 14 ./no_for_all 13. 以檔案大小找出檔案使用-size選項可以透過檔案大小找到檔案。 查找比指定文件更大的文件1 find ~ -size +100M 查找比指定文件小的文件1 f find ~ -size 100M 注意: – 指比給定尺寸小,+ 指比給定尺寸大。沒有符號代表和給定尺寸完全一樣大。 14. 給常用find操作取別名若你發現有些東西很有用,你可以給他取別名。並且在任何你希望的地方執行。 常用的刪除a.out檔。 1 alias rmao="find . -iname a.out -exec rm {} ;" 2 # rmao 刪除程式所產生的檔案。 1 alias rmc="find . -iname core -exec rm {} ;" 2 # rmc {} ;" 2 # rmc 15. 用下的命令刪除大型檔案。 1 find / -type f -name *.zip -size +100M -exec rm -i {} ;" 用別名rm100mrmgrm -i {} ;" 用別名rm100mrmgrm ,rm5g的單一類別名稱來刪除所有大於1G,2G,5G的檔案。 2 # alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} ;" 3 # alias rm2g="find / -type f -3 # alias rm2g="find / -type f -name *.tar -size + 2G -exec rm -i {} ;" 4 # alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} ;」7 # rm1g
8 # rm2g
9 # rm5g
指令為不同