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'
。他的流程是:
- 先列出符合abc*的檔案
- 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的檔案
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. 列出找到的檔案
我們可以用find
跟ls
指令來將找到的檔案的相關資料來完整列出
要將兩個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 {} \;
留言