15個實用的Linux find命令示例

除了在一個目錄結構下查找文件這種基本的操做,你還能夠用find命令實現一些實用的操做,使你的命令行之旅更加簡易。 node

本文將介紹15種不管是於新手仍是老鳥都很是有用的Linux find命令。 vim

首先,在你的home目錄下面建立下面的空文件,來測試下面的find命令示例。 bash

01 # vim create_sample_files.sh
02 touch MybashProgram.sh
03 touch mycprogram.c
04 touch MyCProgram.c
05 touch Program.c
06  
07 mkdir backup
08 cd backup
09  
10 touch MybashProgram.sh
11 touch mycprogram.c
12 touch MyCProgram.c
13 touch Program.c
14  
15 # chmod +x create_sample_files.sh
16  
17 # ./create_sample_files.sh
18  
19 # ls -R
20 .:
21 backup                  MybashProgram.sh  MyCProgram.c
22 create_sample_files.sh  mycprogram.c      Program.c
23  
24 ./backup:
25 MybashProgram.sh  mycprogram.c  MyCProgram.c  Program.c

1. 用文件名查找文件

這是find命令的一個基本用法。下面的例子展現了用MyCProgram.c做爲查找名在當前目錄及其子目錄中查找文件的方法。 socket

1 # find -name "MyCProgram.c"
2 ./backup/MyCProgram.c
3 ./MyCProgram.c

2.用文件名查找文件,忽略大小寫

這是find命令的一個基本用法。下面的例子展現了用MyCProgram.c做爲查找名在當前目錄及其子目錄中查找文件的方法,忽略了大小寫。 測試

1 # find -iname "MyCProgram.c"
2 ./mycprogram.c
3 ./backup/mycprogram.c
4 ./backup/MyCProgram.c
5 ./MyCProgram.c

3. 使用mindepth和maxdepth限定搜索指定目錄的深度

在root目錄及其子目錄下查找passwd文件。 spa

1 # find / -name passwd
2 ./usr/share/doc/nss_ldap-253/pam.d/passwd
3 ./usr/bin/passwd
4 ./etc/pam.d/passwd
5 ./etc/passwd

在root目錄及其1層深的子目錄中查找passwd. (例如root — level 1, and one sub-directory — level 2) 命令行

1 # find -maxdepth 2 -name passwd
2 ./etc/passwd

在root目錄下及其最大兩層深度的子目錄中查找passwd文件. (例如 root — level 1, and two sub-directories — level 2 and 3 ) ip

1 # find / -maxdepth 3 -name passwd
2 ./usr/bin/passwd
3 ./etc/pam.d/passwd
4 ./etc/passwd

在第二層子目錄和第四層子目錄之間查找passwd文件。 md5

1 # find -mindepth 3 -maxdepth 5 -name passwd
2 ./usr/bin/passwd
3 ./etc/pam.d/passwd

4. 在find命令查找到的文件上執行命令

下面的例子展現了find命令來計算全部不區分大小寫的文件名爲「MyCProgram.c」的文件的MD5驗證和。{}將會被當前文件名取代。 rem

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"
2 .
3 ./MybashProgram.sh
4 ./create_sample_files.sh
5 ./backup
6 ./Program.c

6. 使用inode編號查找文件

任何一個文件都有一個獨一無二的inode編號,藉此咱們能夠區分文件。建立兩個名字類似的文件,例如一個有空格結尾,一個沒有。

1 touch "test-file-name"
2  
3 # touch "test-file-name "
4 [Note: There is a space at the end]
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 16187430 test-file-name

你能夠以下面所示在find命令中指定inode編號。在此,find命令用inode編號重命名了一個文件。

1 find -inum 16187430 -exec mv {} new-test-file-name \;
2  
3 # ls -i1 *test*
4 16187430 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

找到每個文件的inode編號。

1 ls -i1
2 804178 file1.txt
3 804179 file2.txt
4 804180 file?.txt

以下所示: 使用inode編號來刪除那些具備特殊符號的文件名。

1 find -inum 804180 -exec rm {} \;
2  
3 # ls
4 file1.txt  file2.txt
5 [Note: The file with name "file?.txt" is now removed]

7. 根據文件權限查找文件

下面的操做時合理的:

  • 找到具備指定權限的文件
  • 忽略其餘權限位,檢查是否和指定權限匹配
  • 根據給定的八進制/符號表達的權限搜索

此例中,假設目錄包含如下文件。注意這些文件的權限不一樣。

1 ls -l
2 total 0
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

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. 使用-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以後建立修改的文件。

01 ls -lrt
02 total 0
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
09  
10 # find -newer ordinary_file
11 .
12 ./everybody_read
13 ./all_for_all
14 ./no_for_all

13. 經過文件大小查找文件

使用-size選項能夠經過文件大小查找文件。

查找比指定文件大的文件

1 find ~ -size +100M

查找比指定文件小的文件

1 find ~ -size -100M

查找符合給定大小的文件

1 find ~ -size 100M

注意: – 指比給定尺寸小,+ 指比給定尺寸大。沒有符號表明和給定尺寸徹底同樣大。

14. 給經常使用find操做取別名

若你發現有些東西頗有用,你能夠給他取別名。而且在任何你但願的地方執行。

經常使用的刪除a.out文件。

1 alias rmao="find . -iname a.out -exec rm {} \;"
2 # rmao

刪除c程序產生的core文件。

1 alias rmc="find . -iname core -exec rm {} \;"
2 # rmc

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 {} \;"
5  
6 # rm100m
7 # rm1g
8 # rm2g
9 # rm5g

Find命令示例(第二部分)

相關文章
相關標籤/搜索