find命令解析
find - search for files in a directory hierarchy
??按目錄層級結構搜索文件
SYNOPSIS
??find pathname -options [-print -exec -ok ...]
OPTIONS
一、按文件名查找
??
-name pattern
??按文件名查找,支持globbing字符
-iname “文件名稱”
??按文件名查找,忽略大小寫,支持glob風格的通配符。
-links n
??File has n links?? 鏈接數為n的文件
-samefile name
??相同inode號的文件 File refers to the same inode as name.-regex "PATTERN"
??以emacs的PATTERN匹配文件全路徑名,而不僅僅是名字,使用該選項時,可用-regextype type選項改變支持的PATTERN類型
-regextype type:
??Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default), posix-awk, posix-basic, posix- egrep and posix-extended.
例:
find ./ -name ip 查找當前目錄下文件名為ip的文件或目錄。
find ./ -iname ip 查找當前目錄下文件名為ip的文件或目錄,並忽略大小寫。
find ./ -iname “ip?” 查找當前目錄下文件名為ip後跟任意字符的文件或目錄,並忽略大小寫
find ./ -iname “ip*” 查找當前目錄下文件名為ip後跟任意長度任意字符的文件或目錄,並忽略大小寫。
find -regex ".*/.*.conf" 查找當前目錄下後輟名為.conf的文件
二、按目錄層級搜索
-maxdepth level
??最大搜索目錄深度,指定目錄為第1級。
-mindepth level
??最大搜索目錄深度,指定目錄為第1級。
[root@promote tmp]# mkdir 1/2/3/4/5/6/7/8 -pv #創建測試文件
mkdir: 已創建目錄 "1"
mkdir: 已創建目錄 "1/2"
mkdir: 已創建目錄 "1/2/3"
mkdir: 已創建目錄 "1/2/3/4"
mkdir: 已創建目錄 "1/2/3/4/5"
mkdir: 已創建目錄 "1/2/3/4/5/6"
mkdir: 已創建目錄 "1/2/3/4/5/6/7"
mkdir: 已創建目錄 "1/2/3/4/5/6/7/8"
[root@promote tmp]# touch 1/a
[root@promote tmp]# touch 1/2/b
[root@promote tmp]# touch 1/2/3/c
[root@promote tmp]# touch 1/2/3/4/d
[root@promote tmp]# touch 1/2/3/4/5/e
[root@promote tmp]# touch 1/2/3/4/5/6/f
[root@promote tmp]# touch 1/2/3/4/5/6/7/g
[root@promote tmp]# touch 1/2/3/4/5/6/7/8/h
[root@promote tmp]# find -mindepth 6 #查找最小層級為6的文件
./1/2/3/4/5/6
./1/2/3/4/5/6/7
./1/2/3/4/5/6/7/8
./1/2/3/4/5/6/7/8/h
./1/2/3/4/5/6/7/g
./1/2/3/4/5/6/f
./1/2/3/4/5/e
[root@promote 1]# find -maxdepth 4 #查找最大層級為4的文件
.
./2
./2/3
./2/3/4
./2/3/4/5
./2/3/4/d
./2/3/c
./2/b
./a
[root@promote 1]#
三、按文件屬主、屬組查找
-user USERNAME :根據文件屬主查找 File is owned by user uname
-group GROUPNAME :根據文件屬組查找 File belongs to group gname
-uid n :根據指定UID查找文件或目錄 File‘s numeric user ID is n
-gid n :根據指定GID查找文件或目錄 File‘s numeric group ID is n.
-nouser :查找沒有屬主的文件或目錄 No user corresponds to file‘s numeric user ID.
-nogroup :查找沒有屬組的文件或目錄 No group corresponds to file‘s numeric group ID.
~]# find / -user basher #在根目錄下查找文件屬主為basher的文件或目錄
~]# find / -group mail #在根目錄下查找文件屬組為mail的文件或目錄
~]# find / -uid 1000 #在根目錄下查找uid為1000的文件或目錄
~]# find / -gid 1000 #在根目錄下查找gid為1000的文件或目錄
~]# find / -nouser #在根目錄下查找沒有屬主的文件或目錄
~]# find / -nogroup #在根目錄下查找沒有屬組的文件或目錄
四、按文件類型查找
??-type TYPE
??TYPE類型如下:
????f:普通文件 d:目錄文件 l:符號鏈接 b:塊設備 c:字符設備 s:套接字文件 p:命名管道
五、按文件大小查找
??-size [+|-]#UNIT
??常用單位:k、M、G 不加單位默認單位為字節
????#UNIT:匹配區間(#-1, #]
????-#UNIT:匹配區間[0,#-1]
????+#UNIT:匹配區間(#,∞)
~]# find /etc -size 5M #在/etc目錄下查找5M大小的文件(查找結果中文件的大小為大於4M,小於等於5M。)
~]# find /etc -size -5M #在/etc目錄下查找小於5M的文件(查找結果中文件小於等於4M。)
~]# find /etc -size +5M #在/etc目錄下查找大於5M的文件(查找結果中文件大於5M。)
六、按時間戳查找
以天為單位:
??訪問時間:-atime[+|-]#
????#:[#, #-1) #天前那一天
????-#:(#, 0] #天內
????+#:(∞, #-1] #天前
??修改時間:-mtime[+|-]#
??改變時間:-ctime[+|-]#
以分鐘為單位
??訪問時間:-amin[+|-]#
??修改時間:-mmin[+|-]#
??改變時間:-cmin[+|-]#
[root@promote 1]# find / -maxdepth 2 -mtime 7 -ls #查找7天前那一天修改過的文件
21792 0 drwx------ 3 user4 user4 74 1月 19 16:08 /home/user4
21796 0 drwx------ 3 user5 user5 74 1月 19 16:08 /home/user5
21800 0 drwx------ 3 user6 user6 74 1月 19 16:08 /home/user6
21804 0 drwx------ 3 user7 user7 74 1月 19 16:08 /home/user7
21808 0 drwx------ 3 user8 user8 74 1月 19 16:08 /home/user8
21812 0 drwx------ 3 user9 user9 74 1月 19 16:08 /home/user9
[root@promote 1]# find / -maxdepth 1 -mtime -5 | xargs ls -ld #查找最近五天更改過的文件
dr-xr-xr-x. 21 root root 4096 1月 26 16:10 /
drwxr-xr-x. 3 root root 22 1月 26 16:11 /1
drwxr-xr-x. 20 root root 3240 1月 24 22:34 /dev
drwxr-xr-x. 130 root root 8192 1月 25 02:37 /etc
drwxr-xr-x. 37 root root 4096 1月 23 01:29 /home
dr-xr-xr-x. 440 root root 0 1月 24 22:34 /proc
dr-xr-x---. 15 root root 4096 1月 24 17:11 /root
drwxr-xr-x. 35 root root 1080 1月 24 14:42 /run
dr-xr-xr-x. 13 root root 0 1月 24 22:34 /sys
drwxrwxrwt. 4 root root 25 1月 26 19:32 /tmp
drwxr-xr-x. 20 root root 4096 1月 24 22:34 /var
[root@lxk tmp]# find -mtime +1 -ls #查找一天前修改過的文件
819205 4 drwxrwxrwt 2 root root 4096 Feb 24 2017 ./.font-unix
819218 4 -rw-r--r-- 1 root root 77 Jan 24 23:47 ./excute.sh
819203 4 drwxrwxrwt 2 root root 4096 Feb 24 2017 ./.X11-unix
819204 4 drwxrwxrwt 2 root root 4096 Feb 24 2017 ./.XIM-unix
819207 4 drwxrwxrwt 2 root root 4096 Feb 24 2017 ./.Test-unix
819206 4 drwxrwxrwt 2 root root 4096 Feb 24 2017 ./.ICE-unix
七、根據權限查找:
-perm[/|-]MODE
MODE:與權限精確匹配
/MODE:任何一類用戶的任何一個權限滿足條件即匹配,權限之間存在或的關系
Any of the permission bits mode are set for the file
-MODE:每一類用戶的每個權限都要滿足條件才匹配
All of the permission bits mode are set for the file.
八、組合查找測試
-a :與關系,需條件同時滿足。
-o :或關系,滿足一個即可。
-not 或 ! :查找條件取反
[root@promote tmp]# mkdir test
[root@promote tmp]# cd test
[root@promote test]# touch a b c d e f g
[root@promote test]# chmod 640 a
[root@promote test]# chmod 666 b
[root@promote test]# chmod 440 c
[root@promote test]# chmod 775 d
[root@promote test]# chmod 777 e
[root@promote test]# ll
總用量 0
-rw-r-----. 1 root root 0 1月 26 15:26 a
-rw-rw-rw-. 1 root root 0 1月 26 15:26 b
-r--r-----. 1 root root 0 1月 26 15:26 c
-rwxrwxr-x. 1 root root 0 1月 26 15:26 d
-rwxrwxrwx. 1 root root 0 1月 26 15:26 e
-rw-r--r--. 1 root root 0 1月 26 15:26 f
-rw-r--r--. 1 root root 0 1月 26 15:26 g
[root@promote test]# find -perm 644 -ls #權限精確查找
205828677 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./f
205828679 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./g
[root@promote test]# find -perm /644 -ls #任何一類用戶的任何一個權限滿足條件即匹配
202038490 0 drwxr-xr-x 2 root root 62 1月 26 15:26 .
203159056 0 -rw-r----- 1 root root 0 1月 26 15:26 ./a
205703301 0 -rw-rw-rw- 1 root root 0 1月 26 15:26 ./b
205828672 0 -r--r----- 1 root root 0 1月 26 15:26 ./c
205828675 0 -rwxrwxr-x 1 root root 0 1月 26 15:26 ./d
205828676 0 -rwxrwxrwx 1 root root 0 1月 26 15:26 ./e
205828677 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./f
205828679 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./g
[root@promote test]# find -perm -222 -ls #每一類用戶的每個權限都要滿足條件才匹配
205703301 0 -rw-rw-rw- 1 root root 0 1月 26 15:26 ./b
205828676 0 -rwxrwxrwx 1 root root 0 1月 26 15:26 ./e
[root@promote test]# find ! -perm -222 -ls #任意一類用戶有沒有寫權限都行?
202038490 0 drwxr-xr-x 2 root root 62 1月 26 15:26 .
203159056 0 -rw-r----- 1 root root 0 1月 26 15:26 ./a
205828672 0 -r--r----- 1 root root 0 1月 26 15:26 ./c
205828675 0 -rwxrwxr-x 1 root root 0 1月 26 15:26 ./d
205828677 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./f
205828679 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./g
[root@promote test]# find -perm /222 -ls #至少一類用戶有寫權限
202038490 0 drwxr-xr-x 2 root root 62 1月 26 15:26 .
203159056 0 -rw-r----- 1 root root 0 1月 26 15:26 ./a
205703301 0 -rw-rw-rw- 1 root root 0 1月 26 15:26 ./b
205828675 0 -rwxrwxr-x 1 root root 0 1月 26 15:26 ./d
205828676 0 -rwxrwxrwx 1 root root 0 1月 26 15:26 ./e
205828677 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./f
205828679 0 -rw-r--r-- 1 root root 0 1月 26 15:26 ./g
[root@promote test]# find ! -perm /222 -ls #所有用戶都沒有寫權限
205828672 0 -r--r----- 1 root root 0 1月 26 15:26 ./c
查找沒有屬主並且沒有屬組的文件:
寫法一:
[root@promote ~]# find /tmp -nouser -a -nogroup -ls
1767500 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/a
1767517 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/b
3412681 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/c
3412685 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/e
3412686 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/f
寫法二:神經病寫法
[root@promote ~]# find /tmp ! ! \( -nouser -o -nogroup \) -ls
1767500 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/a
1767517 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/b
3412681 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/c
3412685 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/e
3412686 0 -rw-rw-r-- 1 1032 1032 0 1月 27 19:31 /tmp/f
九、處理動作
-print:輸出至標準輸出,默認動作。
-ls :類似於對查找到的文件執行ls –l的操作,以長列表形式顯示查找到的文件或目錄。
-delete:刪除查找到的文件(危險操作!!!)
-fls /path/to/somefile:把查找到的文件的長列表信息輸出至指定文件。
-ok COMMAND {} \; :對查找到的文件執行COMMAND操作(交互式)
-exec COMMAND {} \; :對查找到的文件執行command操作(非交互式)
註:
find傳遞查找到的文件路徑至後面的命令時,是先查找出所有符合條件的文件路徑,並一次性傳遞給後面的命令;
但是有些命令不能接受過長的參數,此時命令執行會失敗;使用xargs可規避此問題:find | xargs COMMAND
[root@localhost ~]# find /tmp -type f | xargs ls -l 查找/tmp下普通文件並通過xargs傳遞給ls長列表列出
-rw-r--r-- 1 root root 5 Jan 17 17:25 /tmp/a
-rw-r--r-- 1 root root 11 Jan 17 17:31 /tmp/b
-rw-r--r-- 1 root root 114 Jan 17 17:33 /tmp/c.
[root@localhost tmp]# find /tmp -type f -exec mv {} {}.txt \; 對/tmp下文件添加後輟名.txt(非交互式)
[root@localhost tmp]# ls
a.txt b.txt c.txt
[root@localhost tmp]# find /tmp -type f -ok rm -rf {} \; 查找/tmp下的普通文件並刪除(交互式)
< rm ... /tmp/c.txt > ? y
< rm ... /tmp/a.txt > ? y
< rm ... /tmp/b.txt > ? y
find命令解析