[導讀] 除了在目錄結構下尋找檔案這個基本的操作,你也可以用find指令實作一些實用的操作,讓你的命令列之旅更加簡易。本文將介紹15種無論是於新手或老鳥都非常有用的Linux find指令。首先,在你的home目錄下面創
除了在一個目錄結構下查找檔案這種基本的操作,你還可以用find指令實作一些實用的操作,讓你的命令列之旅更加簡易。
本文將介紹15種無論是於新手或老鳥都非常有用的Linux find指令。
首先,在你的home目錄下面建立下面的空文件,來測試下面的find指令範例。
01 |
# vim create_sample_files.sh |
02 |
touch MybashProgram.sh |
#
|
10 |
touch MybashProgram.sh
#
touch MyCProgram.c
touch Program.c
# chmod +x create_sample_files.sh
# ./create_sample_files.sh
# ls -R
.:
backup 且有 MybashProgram.sh MyCProgram.c
create_sample_files.sh mycprogram.c Program.c
./backup:
MybashProgram.sh mycprogram.c MyCProgram.c Program.c
1. 用檔案名稱尋找檔案
這是find指令的一個基本用法。下面的範例展示了以MyCProgram.c作為查找名在目前目錄及其子目錄中尋找檔案的方法。 |
|
1
# find -name "MyCProgram.c"
./backup/MyCProgram.c
./MyCProgram.c
2.用文件名尋找文件,忽略大小寫
這是find指令的一個基本用法。下面的範例展示了以MyCProgram.c作為查找名在目前目錄及其子目錄中尋找檔案的方法,忽略了大小寫。 |
|
1
# find -iname "MyCProgram.c"
./mycprogram.c
./backup/mycprogram.c
./backup/MyCProgram.c
./MyCProgram.c
3. 使用mindepth和maxdepth限定搜尋指定目錄的深度
在root目錄及其子目錄下尋找passwd檔案。 |
|
1
# find / -name passwd
###./usr/share/doc/nss_ldap-253/pam.d/passwd####
##########
在root目錄及其1層深的子目錄中尋找passwd. (例如root — level 1, and one sub-directory — level 2)
#1 |
# find -maxdepth 2 -name passwd |
在root目錄下及其最大兩層深度的子目錄中尋找passwd檔案. (例如root — level 1, and two sub-directories — level 2 and 3 )
1 |
# find / -maxdepth 3 -name passwd |
##
在第二層子目錄和第四層子目錄之間尋找passwd檔案。
| 1
| # find -mindepth 3 -maxdepth 5 -name passwd
4. 在find指令查找到的檔案上執行指令
下面的範例展示了find指令來計算所有不區分大小寫的檔案名稱為「MyCProgram .c」的文件的MD5驗證和。 {}將會被目前檔案名稱取代。
| 1
| find -iname "MyCProgram.c" -exec md5sum {} \;
| 2
| d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c
| 3
| d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c
| 4
| d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c
#
| 5
| d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
5. 相反地符合
顯示所有的名字不是MyCProgram.c的檔案或目錄。由於maxdepth是1,所以只會顯示目前目錄下的檔案和目錄。
| 1
| find -maxdepth 1 -not -iname "MyCProgram.c"
| 4
| ./create_sample_files.sh
6. 使用inode編號尋找檔案
任何一個檔案都有一個獨一無二的inode編號,藉此我們可以區分檔案。建立兩個名字相似的文件,例如一個有空格結尾,一個沒有。
| 3
| # touch "test-file-name "
| 4
| [Note: There is a space at the end]
從ls的輸出不能區分哪個檔案有空格結尾。使用選項-i,可以看到檔案的inode編號,藉此可以區分這兩個檔案。
| 2
| 16187429 test-file-name
| 3
| 16187430 test-file-name
####
你可以如下面所示在find指令中指定inode編號。在此,find指令用inode編號重新命名了一個檔案。
1 |
find -inum 16187430 -exec mv {} new-test-file-name \; |
4 |
16187430 new-test-file-name | #
5 |
16187429 test-file-name |
你可以在你想要對那些像上面一樣的糟糕命名的檔案做某些操作時使用這項技術。例如,名為file?.txt的檔案名稱中有一個特殊字元。若你想執行“rm file?.txt”,下面所示的所有三個檔案都會被刪除。所以,採用下面的步驟來刪除"file?.txt"檔案。
2 |
file1.txt file2.txt file?.txt | #
找到每一個檔案的inode編號。
如下: 使用inode編號來刪除那些有特殊符號的檔案名稱。
1 |
find -inum 804180 -exec rm {} \; | #
5 |
[Note: The file with name "file?.txt" is now removed] |
7. 根據文件權限尋找文件
#下面的操作時合理的:
找到具有指定權限的文件
忽略其他權限位,檢查是否和指定權限匹配
#根據給定的八進位/符號表達的權限搜尋
此範例中,假設目錄包含下列檔案。注意這些文件的權限不同。
3 |
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all |
4 |
-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 |
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file |
7 |
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read | #
8 |
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read |
找到具有群組讀取權限的檔案。使用下面的命令來找到當前目錄下對同組用戶具有讀取權限的文件,忽略該文件的其他權限。
1 |
find . -perm -g=r -type f -exec ls -l {} \; |
2 |
-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read |
3 |
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all | #
4 |
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read |
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
只列出你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. 使用-type找出指定檔案類型的檔案
只找socket檔案 |
|
1
find . -type s
#1
find . -type d
#1
find . -type f
##
|
|
尋找所有的隱藏檔案
#1
find . -type f -name ".*"
|
|
找出所有的隱藏目錄
#1
find -type d -name ".*"
|
| 12. 透過和其他檔案比較修改時間來尋找檔案
顯示在指定檔案之後做出修改的檔案。下面的find指令將顯示所有的在ordinary_file之後會建立修改的檔案。
03 |
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read | #
04 |
----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_file |
06 |
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read |
07 |
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all |
08 |
---------- 1 root root 0 2009-02-19 20:31 no_for_all |
10 |
# find -newer ordinary_file |
14
./no_for_all
| 13. 透過檔案大小找出檔案 | 使用-size選項可以透過檔案大小找出檔案。
尋找比指定檔案大的檔案
############1###
###find ~ -size +100M###
##########
尋找比指定檔案小的檔案
尋找符合給定大小的檔案
注意: – 指比給定尺寸小,+ 指比給定尺寸大。沒有符號代表和給定尺寸完全一樣大。
14. 給常用find運算取別名
若你發現有些東西很有用,你可以給他取別名。並且在任何你希望的地方執行。
常用的刪除a.out檔。
1 |
alias rmao="find . -iname a.out -exec rm {} \;" |
刪除c程式產生的core檔。
1 |
alias rmc="find . -iname core -exec rm {} \;" |
15. 用find指令刪除大型打包檔
下面的指令刪除大於100M的*.zip檔。
1 |
find / -type f -name *.zip -size +100M -exec rm -i {} \;" |
用別名rm100m刪除所有大雨100M的*.tar檔案。使用相同的想法可以建立rm1g,rm2g,rm5g的一類別名來刪除所有大於1G,2G,5G的檔案。
1 |
alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;" |
2 |
# alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;" |
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 {} \;" |
Find指令範例(第二部分)
以上是Linux find15個常用指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!