1. 程式人生 > >Linux命令之find(一)

Linux命令之find(一)

find命令的使用格式為:find options path expressions
find命令其實有兩種options,一種是“真正屬於自己的”,另一種位於expressions內部。第一種選項一共就5個:-P -L -H -D -O,其中-D用來顯示除錯資訊;-O用來指定優化級別,後面緊跟一個數字(沒有空格),它們倆的具體資訊可以看man。而-P -L -H的作用是“control the treatment of symbolic links”,不指定它們中的任意一個時,預設為-P,即不跟蹤連結。所謂跟蹤連結是指:若被搜尋的目錄下有一個符號連結,且指向另一個目錄,那麼被指向的目錄也將被搜尋。
第二種選項和第一種被path隔開,實際上,第一種選項比較少使用,find後面往往直接就是path,即要搜尋的目錄。如果不指定path,預設為當前目錄。搜尋的時候,指定目錄的子目錄也是被搜尋的物件,所以path可以視為start_dir。可以同時指定多個目錄。

真正的重頭戲是expressions,它也有三部分:options test actions。

由於path後面經常直接就是test,其他兩項出現的也比較少,所以先從test開始。

  • -name pattern:匹配檔名為“pattern”的所有檔案。大多數情況下,我們都是按照檔名來查詢檔案的,所以這是使用最頻繁的選項。
    要注意:pattern中不應該包含路徑名,只有最終的檔名,即basename是pattern,否則會報錯,路徑名應該在path中指定;這裡要求檔名和pattern必須完全一致。如下:

    m@meng:~$ ls tmp/
    onlyme  onlyme1  test.sh
    m@meng
    :~$ find tmp/ -name onlyme tmp/onlyme m@meng:~$ find tmp/ -name only m@meng:~$

    可以看到,只寫一部分名稱是不會被匹配的。
    -name選項支援簡單的shell字元擴充套件,如*、[]、?,其中*匹配任意數量的任意字元;?匹配一個任意字元;[]匹配任意一個出現在括號中的字元:

    m@meng:~/tmp$ find . -name onlym[eg]
    ./onlyme
    m@meng:~/tmp$ find . -name ??lyme
    ./onlyme
    m@meng:~/tmp$ find . -name on*
    ./onlyme

    更復雜的擴充套件就不支援了,這時就需要下面的-regex選項。
    -name還有幾個變種:
    -iname:忽略大小寫的-name;
    -lname:File is a symbolic link whose contents match shell pattern.這意思是匹配符號連結指向的檔名,而不是符號連結名本身。
    -ilname:同上,忽略大小寫。

  • -regex pattern:這裡的pattern就可以是完全的正則表示式了,為防意外最好用引號括起來。pattern是用正則表示式表示的file name。
    -regex還有一個變種-iregex,可以忽略大小寫。

  • -path pattern:由於-name選項不能使用路徑分隔符(name中出現“/”會報錯),也就是無法選擇子目錄,但是某些情況下我們需要指定子目錄或排除某些子目錄(配合-prune),所以就有了這個選項。
    要注意的是,-path後面的pattern必須以前面指定的目錄為起始路徑:若指定目錄是相對路徑“.”,則pattern也必須以“.”開頭;若指定目錄是絕對路徑,則pattern也要把這部分路徑加在前面。如下:

    m@meng:~/patches$ ls tmp/
    new  nw  onlyme  test.sh
    m@meng:~/patches$ find . -path ./tmp/on*
    ./tmp/onlyme
    m@meng:~/patches$ find . -path tmp/on*
    m@meng:~/patches$ 
    m@meng:~/patches$ find /home/m/patches/ -path /home/m/patches/tmp/on*
    m@meng:~/patches$ /home/m/patches/tmp/onlyme

    -path也支援簡單的元字元擴充套件,但是為了保險起見,最好把pattern用雙引號括起來,如下:

    m@meng:~/patches$ find . -path ./tmp/*
    find: 路徑必須在表示式之前: ./tmp/nw
    用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
    m@meng:~/patches$ find . -path "./tmp/*"
    ./tmp/nw
    ./tmp/onlyme
    ./tmp/test.sh
    ./tmp/new

    我看到很多文章使用下面的方法來尋找子目錄中的檔案,本人實驗後發現不管用:

    m@meng:~/patches$ find . -path ./tmp
    ./tmp
    m@meng:~/patches$ find . -path ./tmp -name onlyme
    m@meng:~/patches$ 

    我們看到,如果只有子目錄的名稱(名稱後面不要又斜線),那麼就只匹配子目錄本身,而不會去把子目錄下面的所有檔案都匹配;而用path指定子目錄後,再使用-name指定名稱將不會得到想要的結果,所以只能在pattern中把檔名補上。然而下面這種方法可以:

    m@meng:~/patches$ find . -path ./tmp -o -name onlyme
    ./tmp
    ./tmp/onlyme

    這裡使用了-o選項,將在後面討論。

  • -uid n以及-user name:都是根據檔案的owner來匹配,前者根據owner的UID,後者根據name。

  • -gid n以及-group name:同上,只是換成了group。
  • -nouser以及nogroup:若某個檔案的屬主或屬組已經被刪除,則匹配。

  • -type c:匹配檔案型別為c的所有檔案。c的具體值包括:f(普通檔案)、b(塊裝置)、c(字元檔案)、d(目錄)、l(符號連結)等等。

  • -size:根據檔案的大小來匹配。支援的單位包括c(bytes)、w(word,2bytes)、b(blocks,512bytes)、k(1024bytes)、M(1024k bytes)、G(1024M bytes)。

    [email protected]:~/workspaces$ find . -size 1c 
    ./.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version      ./.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version
    ./.metadata/.plugins/org.eclipse.cdt.make.core/specs.c
    ./.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp
    [email protected]:~/workspaces$ find . -size -1c 
    ./.metadata/.plugins/com.genuitec.org.hibernate.eclipse/hibernate-tools.log
    ./.metadata/.plugins/org.skyway.core/compass/index/core/clearcache
    [email protected]:~/workspaces$ find . -size +2c -size -5c 
    ./.metadata/.plugins/org.eclipse.jdt.core/assumedExternalFilesCache
    ./.metadata/.plugins/org.eclipse.jdt.core/invalidArchivesCache

    test中經常要用到數字,所以必然會涉及數值範圍問題。find給出的方法是,在數字前面加“+”表示大於該數字,而“-”表示小於該數字,沒有符號表示等於該數字。

  • -inum n與-samefile name:根據是否是同一個檔案來匹配。inum表示inode number,當一個檔案的indoe與指定的n相同時,匹配;同理,-samefile直接使用檔名,若某個檔案與指定的name具有相同的inode,匹配。

  • -readable、-writable、-executable:很顯然,這是按檔案許可權來過濾檔案的。比如,加上-executable,那麼沒有可執行許可權的檔案將會被過濾掉。
    不過,大家都知道,檔案的許可權分為三組,即使用者(u)、群組(g)和其他(o),每組的許可權又分為讀(r)、寫(w)和執行(x)。那麼這三個選項到底屬於哪個組呢?我暫時還沒研究清楚,不過幸好find還有對許可權進行匹配的更詳細更常用的選項,就是下面的-perm。

  • -perm mode:根據檔案的許可權來匹配。但是指定許可權mode的時候有三種模式:mode、-mode、/mode。
    純mode格式意味著嚴格匹配,即每組許可權都必須指定且完全一樣,不能只指定其中一組而其他組預設。
    -mode格式就要寬鬆許多,比如-o=x,那麼只要一個檔案的o組至少有x許可權就可以匹配(有沒有r和w許可權無所謂),而其他組不管;再比如-221,那意味著一個檔案的u組和g組至少有w許可權o組至少有x許可權就可以匹配,於是-o=x相當於-001。所以-mode格式是“至少模式”。
    /mode格式還要寬鬆,在/mode格式指定的三組許可權中,只要有一組達到了“至少模式”,就可以成功匹配。可以用一個公式表達/mode,比如/124 <==> -100 || -020 || -004; /u=w,o=r <==> -u=w || -o=r。舉幾個例子吧:

    m@meng:~/tmp$ ls -lA
    總用量 8
    ---x-w---x 1 m    m     6  623 01:22 onlyme
    -rw-rw-r-- 1 root root  0  627 12:09 onlyme1
    -r-xr-x--x 1 m    m    66  623 02:57 test.sh
    m@meng:~/tmp$ find . -perm /242
    .
    ./onlyme1
    ./test.sh
    m@meng:~/tmp$ find . -perm /go=w
    .
    ./onlyme
    ./onlyme1
    m@meng:~/tmp$ find . -perm /go=x
    .
    ./onlyme
    ./test.sh
    m@meng:~/tmp$ find . -perm -g=x
    .
    ./test.sh
    m@meng:~/tmp$ find . -perm -120
    .
    ./onlyme
    m@meng:~/tmp$ find . -perm 121
    ./onlyme
  • -amin、-atime、-anewer:這三項都是根據檔案的“上次訪問時間”屬性來做匹配的。
    -atime n:檔案的上次訪問時間是n天之前,則匹配。嚴格的說,n代表的其實不是“天”,而是24小時,即從現在這一刻起,往前的24*n~24*(n+1)小時之內若檔案被訪問過,則匹配,注意必須嚴格是這個區間。這裡可以將n換成-n或+n,代表的範圍分別是0~24*n和24*(n+1)~無窮大。
    -amin n:這裡的n代表的是分鐘。若檔案的上次訪問時間與現在時間相差的分鐘數是n-1,則匹配。
    -anewer file:計算出file的mtime,若某個檔案的上次訪問時間在這個mtime之後,則匹配。
    類似的組合還有:-ctime、-cmin、-cnewer,這裡只是把上次訪問時間改成了上次更改時間;-mtime、-mmin、-newer,“上次訪問時間”改成上次改動時間。這三類時間的區別參見stat命令。

  • -newerXY file/time:這是上面那些選項的集大成者。。newer後面有兩個佔位符,它們的值可以是a、m、c、t分別代表上次訪問時間、上次modify時間、上次change時間和絕對時間;find根據Y的值來計算file的某個時間戳,然後根據X的值來做匹配。這裡不舉例子不行了:

    m@meng:~/tmp$ stat *
    File: ‘onlyme’
    Access: 2015-06-28 13:58:31.859458991 +0800
    Modify: 2015-06-28 12:49:16.115352584 +0800
    Change: 2015-06-28 13:58:31.859458991 +0800
    File: ‘test.sh’
    Access: 2015-06-28 13:39:07.203429170 +0800
    Modify: 2015-06-28 13:40:16.739430951 +0800
    Change: 2015-06-28 13:42:03.779433692 +0800
    m@meng:~/tmp$ find . -neweram onlyme 
    .
    ./onlyme
    ./test.sh
    m@meng:~/tmp$ find . -newerma onlyme 
    m@meng:~/tmp$
    m@meng:~/tmp$ find . -newermt "2015-06-28 13:23:16"
    .
    ./test.sh

    這裡刪去了一部分stat命令的輸出。可以看到,同樣是file=onlyme,當XY=am時,find計算出onlyme的mtime為2015-06-28 12:49:16,然後在指定目錄中尋找那些atime在這個時間之後的檔案,顯然onlyme和test.sh的atime都符合條件;而XY=ma時,計算出onlyme的atime是2015-06-28 13:58:31,但是指定目錄中任一檔案的mtime都在這個時間之前,所以沒有匹配。
    最後一個例子,令Y=t,然後指定一個絕對時間,接著搜尋指定目錄中mtime在這個時間之後的檔案。顯然,另X=t是無意義的,所以會報錯。

  • empty:若一個檔案是空的,並且不是普通檔案或目錄,則匹配。也可以說,若某個檔案使用file命令的結果是empty,則匹配。
  • -links n:若某個檔案的硬連結數量是n,則匹配。

至此,test中常用的那些都介紹完了,可以看出find做檔案匹配時主要基於以下幾類檔案屬性:名稱和路徑;屬主和屬組;許可權;大小、型別及inode;時間戳;其他。
下篇介紹其他雜項。

相關推薦

Linux命令find()

find命令的使用格式為:find options path expressions find命令其實有兩種options,一種是“真正屬於自己的”,另一種位於expressions內部。第一種選項一共就5個:-P -L -H -D -O,其中-D用來顯示除錯

Linux命令find命令中的-mtime參數

linux find mtime 有關find -mtime這個參數的使用有比較多的坑,今天把這個問題在這裏記錄下來: mtime參數的理解應該如下: -mtime n 按照文件的更改時間來找文件,n為整數。 n 表示文件更改時間距離為n天 -n 表示文件更改時間距離在n天以內 +n 表

Linux命令find詳解

linux 運維 系統 find 命令 介紹find工作中常用的Linux基礎命令之一,可以按照類型、大小、名字、修改時間、訪問時間、改變時間、權限等參數進行查找我們想要的文件或目錄。find查找還可以結合很多命令來達到我們想要的結果,比如:和sed、xargs等命令連用;通過管道符號“|

Linux命令find的用法

find顧名思義就是查詢,Linux下find命令提供相當多的查詢條件,因此功能比較強大,可以在眾多檔案或目錄下查詢你想要的任何檔案或目錄。 find 命令格式:find pathname -options [-print -exec -ok...] pathname表示find命令所查

linux命令find

find 查詢命令 命令格式 find [查詢目錄] [查詢規則] [查詢完後的操作] find -name ##檔名查詢 -maxdepth ##查詢深度距離當前目錄最多x深度的檔案

linux命令----find用於指定目錄下查詢檔案

1、find命令作用 find命令用來在指定目錄下查詢檔案。任何位於引數之前的字串都將被視為欲查詢的目錄名。如果使用該命令時,不設定任何引數,則find命令將在當前目錄下查詢子目錄與檔案。並且將查詢到的子目錄和檔案全部進行顯示。 2、find語法 find path

Linux進階命令find

linux命令 find find目的:查找符合條件的文件格式:find 目錄名 選項 查找條件find /work/001_linux_basic/dira -name "*.txt"查找指定目錄下所有以.txt結尾的文件,其中,*是通配符fi

03.linux命令查找文件(find,whereis,which,locate)

位置 找文件 TE 查看 命令 CA locate HERE linux 1.區別 which 查看可執行文件的位置 whereis 查看文件的位置 locate 配 合數據庫查看文件位置 find 實際搜尋硬盤查詢文件名稱

Linux基本命令find

water nag vpd bbed size character fff 分享圖片 命令 find:查找格式:find -type 文件類型(-f(dile),d(directory),c(character),b(block),s(socket),l(link))-na

Linux 基礎 find 命令

一、find命令的簡單瞭解 find命令用來在指定目錄下查詢檔案。任何位於引數之前的字串都將被視為欲查詢的目錄名。 find命令主要用於檔案搜尋,它的功能非常強大,可以根據不同的標準搜尋任何檔案,可以在任何位置進行檢索。 二、常見的命令引數 首先在/mnt下建立檔案,搭建實驗環境:

Linux命令stty

repl 位置 而不是 connector 啟動 previous dsr 根據 pass 用途說明 stty命令用於顯示和修改終端行設置(change and print terminal line settings)。 常用參數 stty命令不帶參數可以打印終端行設置,

Linux命令kill

多種方式 輸入 字符 指定 避免 選項 con 擴展 firefox 精通Linux的kill命令    不管你使用哪種操作系統,你一定會遇到某個行為失常的應用,它把自己鎖死並拒絕關閉。在Linux(還有Mac)。你能夠用一個"kill"命令強制終結它。在這個教程中,我

Linux命令netstat

unknown 網絡相關 mes packet forward 提示 send 狀態 統計 Linux命令之netstat詳解 簡介 Netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerad

linux 命令 apt-get

檢查 end 修正 blog font span man 損壞 /var/ apt-get 是一個下載安裝軟件包的簡單命令行接口 使用方法: apt-get [OPTIONS] [COMMANDS] [PACKAGE_NAMES] OPTIONS:

linux 命令 watch

html shell ati watch命令 art track pwd -s 周期 watch能夠幫你監測一個命令的執行結果,省得你一遍遍的手動執行。在Linux下。watch是周期性的執行下個程序。並全屏顯示執行結果。你能夠拿他來監測你想要的一切命令的結果變化,

Linux命令CP詳解

linux命令之cp詳解Linux命令之CP詳解嘿嘿,又一周過去了,大家過的怎麽樣呢,在這一周時間裏,小編可是又學到不少新知識呢。今天呢,小編就和大家分享一下Linux中我們常用的CP的命令,這裏的cp可是copy的簡寫噢。(容我嘚瑟一下) 學過linux的都知道,在我們操作的過程中,我們常常會用到cp這個命

linux命令小結(

命令 linux 基礎 1)pwd:顯示工作目錄路徑語法: pwd [選項]選項: -L 目錄鏈接時,輸出鏈接路徑 -P 輸出物理路徑例子: [[email protected]/* */ ~]# pwd /root //顯示當前路徑2)

linux命令head、tail命令具體解釋

-c pri fadein rip lin comment pen inux ont head 語法 樣例 tail 語法 樣例 head和tail組合使用方法舉例 head 語法 head [-n -k ].

Linux命令——id

命令 linux id id命令是查看用戶相關屬性信息。顯示真實有效的id(UID)和組ID(GID),UID是對應用戶的單一身份標識,GID則是對應多個UID。常用參數:  -g或--group  顯示用戶所屬群組的ID。  -G或--groups  顯示用戶所屬附加群組的ID。  -n或--n

Linux-命令-基本-find-xargs-exec

技術 txt 參數 什麽 結果 args 基本 name exec 命令: find <path> [option] 參數: -type: f 文件 d 目錄 -name: 文件或目錄名 -exec: 對查找到的結果執行什麽動作.     e.g. find