Linux搜尋檔案的指令用法

Linux搜尋檔案的指令用法

參考文章:http://www.linux.com/community/blogs/133-general-linux/732993

在使用Linux中怎樣有效率的來找尋你要的檔案, find這個指令這是很重要的,而我剛好看到Linux.com
有關於find指令的範例教學覺得滿有用的,所以把文章給看完也寫出來分享給需要的人,順便也給自己
忘記要怎麼用find的時候來看恢復記憶。如果有發現有錯誤的話,請跟我說我會立刻修正。

1. 列出目前的目錄底下的所有檔案跟目錄(子目錄也會全部列出來)

    $ find
    .
    ./abc.txt
    ./subdir
    ./subdir/how.php
    ./cool.php

下面的command跟只用find的結果一樣

    $ find .
    $ find . -print

2. 搜尋特定的目錄跟路徑

搜尋特定的目錄只要在find後面加上路徑就可以了,下面的例子是列出test這個目錄 的所有目錄跟檔案

    $ find ./test
    ./test
    ./test/abc.txt
    ./test/subdir
    ./test/subdir/how.php
    ./test/cool.php

如果你要在特定的目錄底下,搜尋特定的檔案的話加上-name xxx, xxx代表檔案名稱

    $ find ./test -name abc.txt
    ./test/abc.txt

你當然可以用萬用字元來找你要的檔案

    $ find ./test -name *.php
    ./test/subdir/how.php
    ./test/cool.php

3. 限制搜尋的深度

看下面的範例就知道加入-maxdepth n(n是數字)這個參數的話,你可以限制要進入目錄的深度 因為原來使用find是利用遞歸的方式來找目錄底下的所有東西,但是有時候並不需要讓find走 這麼深,所以可以用-maxdepth來限制,這個指令也是滿常會用到的,所以一定要記起來。

    $ find ./test -maxdepth 2 -name *.php
    ./test/subdir/how.php
    ./test/cool.php

    $ find ./test -maxdepth 1 -name *.php
    ./test/cool.php

4. Invert match

Invert match意思就是將你原本要列出match的檔案或目錄,來反轉列出。用範例來講 find ./test -name *.php是要列出目錄底下所有的php檔案,但是你想反過列出其他 檔案不包含php的話就用-not or !就可以了

    $ find ./test -not -name *.php
    ./test
    ./test/abc.txt
    ./test/subdir

另一個方式 :驚嘆號

    find ./test ! -name *.php

5. 組合多個搜尋的方式

find可以讓你組合多種搜尋的方式,例如以下的範例,他組合了-name 'abc*'! -name '*.php'這兩個 他會先執行-name 'abc*'然後將輸出的結果在執行! -name '*.php'。他的流程是:

  1. 先列出符合abc*的檔案
  2. Invert match 不需要的檔案(*.php)

但是這種組合方式只用在當你要找特定的檔案並且反相(inverting)的時候才能用

    $ find ./test -name 'abc*' ! -name '*.php'
    ./test/abc.txt
    ./test/abc

OR operator

find提供了-o來組合多個搜尋的方式,看下面的例子就是要同時列出目前目錄的php跟txt的所有檔案 這也是很常會用到一定要學起來。

    $ find -name '*.php' -o -name '*.txt'
    ./abc.txt
    ./subdir/how.php
    ./abc.php
    ./cool.php

6. 只有搜尋檔案或目錄

如果你只有要搜尋檔案或是目錄的時候,你可以用-type c, c代表 type, 那以下是他支援的type

File is of type c:
    b      block (buffered) special
    c      character (unbuffered) special
    d      目錄
    p      named pipe (FIFO)
    f      檔案
    l      symbolic  link;  this is never true if the -L option or the -follow option is in effect, unless
           the symbolic link is broken.  If you want to search for symbolic links when -L  is  in  effect,
           use -xtype.
    s      socket
    D      door (Solaris)
    $ find ./test -name abc*
    ./test/abc.txt
    ./test/abc

    Only files

    $ find ./test -type f -name abc*
    ./test/abc.txt

    Only directories

    $ find ./test -type d -name abc*
    ./test/abc

7. 多個目錄一起搜尋

find允許你一次搜尋多個目錄底下的檔案,所以你只要在find指令後面加上要搜尋的目錄就可以了

    $ find ./test ./dir2 -type f -name abc*
    ./test/abc.txt
    ./dir2/abcdefg.txt

8. 找出隱藏檔案

    $ find ~ -type f -name ".*"

9. 找出特定權限的檔案

你可以用-perm xxxx來找出特定權限的檔案,xxxx代表權限的數字

    $ find . -type f -perm 0664
    ./abc.txt
    ./subdir/how.php
    ./abc.php
    ./cool.php

接著你也可以用!來找出錯誤的或是權限是被設定不正確的檔案,這也滿有用的

    $ find . -type f ! -perm 0777
    ./abc.txt
    ./subdir/how.php
    ./abc.php
    ./cool.php

10. 找出檔案特殊權限sgid/suid的檔案

什麼是sgid/suid/sbit

    4  SUID (Set UID)
    2  SGID (Set GID)
    1  SBIT (Sticky Bit)

利用-perm來找出權限是644跟帶有sgid bit的檔案

    $ find / -perm 2644

-perm也允許你可以用/u=s來取代1664來搜尋有Sticky Bit的檔案

    $ find / -maxdepth 2 -perm /u=s 2>/dev/null
    /bin/mount
    /bin/su
    /bin/ping6
    /bin/fusermount
    /bin/ping
    /bin/umount
    /sbin/mount.ecryptfs_private

P.S. “2>/dev/null” 移除所有”Permission Denied”的Error訊息

11. 找出唯讀檔案

找出所有唯讀的檔案,只要加上/u=r就可以了

    $ find /etc -maxdepth 1 -perm /u=r
    /etc
    /etc/thunderbird
    /etc/brltty
    /etc/dkms
    /etc/phpmyadmin
    ... output truncated ...

12. 找出可執行的檔案

找出所有人可以執行的檔案加上/a=x就可以了

    $ find /bin -maxdepth 2 -perm /a=x
    /bin
    /bin/preseed_command
    /bin/mount
    /bin/zfgrep
    /bin/tempfile
    ... output truncated ...

13. 找出屬於特定使用者的檔案

只要加上-user username就可以了

    $ find . -user bob
    .
    ./abc.txt
    ./abc
    ./subdir
    ./subdir/how.php
    ./abc.php

找出特定使用者的特定的檔案的方法

    $ find . -user bob -name '*.php'

14. 找出屬於特定群組的檔案

    $ find /var/www -group developer

15. 找出被改過N天的檔案

加上-mtime N,N是天數,下面的範例就是找出被改過50天的檔案

    $ find / -mtime 50

16. 找出被存取(accessed)過N天的檔案

加上-atime N,N是天數

    $ find / -atime 50

17. 找出在某個天數內被修改過的檔案

下面的範例就是找出已經在50到100天內被修改過的檔案

    find / -mtime +50 mtime -100

18. 找出在N分鐘內有被變動的檔案

    $ find /home/bob -cmin -60

19. 找出在N分鐘內有被修改過的檔案

    $ find / -mmin -60

20. 找出在N分鐘內有被存取過的檔案

    $ find / -amin -60

21. 找出特定的大小的檔案

找出50MB的所有檔案

    $ find / -size 50M

22. 找出特定範圍大小的檔案

找出大於50MB~小於100MB的檔案

    $ find / -size +50M -size -100M

23. 找出最大和最小的檔案

利用find搭配其他指令來找出最大跟最小的前五個檔案

    找出最大的檔案
    $ find . -type f -exec ls -s {} \; | sort -n -r | head -5
    找出最小的檔案
    $ find . -type f -exec ls -s {} \; | sort -n | head -5

24. 找出空白的檔案跟空的資料夾

只要加上-empty就可以找出空白的檔案跟空的資料夾

    找出空白的檔案
    $ find /tmp -type f -empty
    找出空白的的資料夾
    $ find ~/ -type d -empty

25. 列出找到的檔案

我們可以用findls指令來將找到的檔案的相關資料來完整列出 要將兩個command組合一起用的話,非常簡單只要使用-exec就可以了

    $ find . -exec ls -ld {} \;
    drwxrwxr-x 4 enlightened enlightened 4096 Aug 11 19:01 .
    -rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./abc.txt
    drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:48 ./abc
    drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:26 ./subdir
    -rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:26 ./subdir/how.php
    -rw-rw-r-- 1 enlightened enlightened 29 Aug 11 19:13 ./abc.php
    -rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./cool.php

-exec說明

ls -ld  指令
{}      find 找到的檔案
\;      指令的結束

26. 刪除所有符合的檔案或目錄

下面的範例是移除在/tmp目錄底下所有的text檔案

    $ find /tmp -type f -name "*.txt" -exec rm -f {} \;

移除特定目錄底下檔案大小是10M的所有log檔

    $ find /home/bob/dir -type f -name *.log -size +10M -exec rm -f {} \;

留言

熱門文章