1. 程式人生 > >find命令解析

find命令解析

添加 非交互 home inode glob 精確 並且 max 字節

NAME

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命令解析