# find paths expression
Find 是一個常用的指令,相當好用卻也是一個相當難記的指令,下面列出一些常用的參數.
- -name
[root@benjr root]# find / -name "passwd"
依名稱來搜尋檔案,可以使用 *,? 等字元為搜尋目標.
- -nouser , -nogroup
依檔案的擁有者不屬於任何使用者 (User owner 為數字或不存在於 /etc/passwd 檔案中) 來搜尋,另外針對group還有 -nogroup 可用.[root@benjr root]# find /home -nouser [root@benjr root]# find /home -nogroup
除了可以單獨使用還可以搭配來使用。 使用參數 -o(-or) 還有 -a(-and) 還有 !(-not)
[root@benjr root]# find /home -nouser -o -nogroup
這樣就可以找檔案的擁有者不屬於任何使用者或者不屬於任何群組.
- -perm
我們還可以依據檔案的 rwx 屬性來尋找.[root@benjr root]# find / -perm 644
找出 file permition 為 644(rw-r–r–) 的檔案,另外還可以用 -644(只比較644(rw-r–r–)不管其他bit為何),+644(只要其中一個bit相符合既可)
[root@benjr root]# find / -perm -644 [root@benjr root]# find / -perm +644
找出檔案屬性有 SUID 者. 還可用-4000(SUID) -2000 (SGID) -1000(sTicky Bit) 等
[root@benjr root]# find / -perm -4000 [root@benjr root]# find / -perm -2000 [root@benjr root]# find / -perm -1000
- -size
找出檔案大於 100M的,100000單位為 kbyte. “+” 代表大於100000k, “-” 代表小於 100000k.[root@benjr root]# find / -size +100000
- -exec
參數 -exec 將之前的結果轉向 ls -l 來處理 , {} 表示之前的結果 , \; 結束.[root@benjr root]# find . -nouser -exec ls -l {} \;
至於要找檔案內容的除了要使用 find 還要配合 grep -l(-l :files with matches),如果你要找 /root 目錄下所有的檔案內容包含 Ben 字串的檔案.可以用下面方法來實現.
[root@benjr root]# find /root/* -exec grep -l Ben {} \;
至於 find 的 -exec 參數請參考上面的範例,grep的參數 -l 為只會列出含有此特定字串的檔案名稱.
- -type f , -type d , -type l
找出屬性為檔案 f (file) ,還可針對目錄 d (directory) ,連結 l (softlink)來尋找.[root@benjr root]# find / -type f [root@benjr root]# find / -type d [root@benjr root]# find / -type l
計算目錄中各個子目錄分別的容量
[root@benjr root]# find /home -maxdepth 1 -type d -exec du -sh {} \; 40M /home 20M /home/user1 20M /home/user2
在指定的目錄內,將檔案修改成 664 (rw-r–r–)
# find /path/to/site/ -type f -exec chmod 664 {} \;
在指定的目錄內,將目錄修改成 775 (rwxrwxr-x)
#find /path/to/site/ -type d -exec chmod 775 {} \;
下面是針對 檔案的時間 ( mtime / ctime / atime ) 來做搜尋.
- mtime / ctime / atime
先來了解一下 Linux 會記錄檔案的三種時間 mtime / ctime / atime[root@benjr ~]# stat test File: ‘test’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 801h/2049d Inode: 269772 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-06-06 18:38:50.664135013 +0800 Modify: 2016-06-06 18:38:50.664135013 +0800 Change: 2016-06-06 18:38:50.664135013 +0800 Birth: -
-
atime(Access): time of last access
這裡記錄著上一次最後存取這個檔案的時間,只要這檔案被存取過這時間就會被更新,如果這檔案是可執行檔在執行後這時間也會被改變.也可以透過 ls -lu 來看 atime[root@benjr ~]# cat test [root@benjr ~]# stat test File: ‘test’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 801h/2049d Inode: 269772 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-07-26 09:33:42.795224480 +0800 Modify: 2016-06-06 18:38:50.664135013 +0800 Change: 2016-06-06 18:38:50.664135013 +0800 Birth: -
-
mtime(Modify): time of last modification
紀錄上一次檔案被更改的時間,只要檔案內容被修改過 mtime 的會被更新.也可以透過 ls -l 來看 mtime -
ctime(Change): time of last status change
只要是檔案或是目錄的 inode 被改變(owner, permissions, 等.)這時間就會被更新.還有當檔案被更新時這 ctime 也會被更新. dump 的備份指令就是透過 ctime 來看需不需要將這檔案做備份為依據. 可以透過 ls -lc 來看 ctime[root@benjr ~]# echo test >> test [root@benjr ~]# stat test File: ‘test’ Size: 5 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 269772 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-07-26 09:33:42.795224480 +0800 Modify: 2016-07-26 09:34:12.812208000 +0800 Change: 2016-07-26 09:34:12.812208000 +0800 Birth: -
# find paths expression
以時間為搜尋的 find 後面的 expression 可以為剛剛所提到的 mtime / ctime / atime 再加上要搜尋的 時間點
- -mtime n
n 表示要搜尋 n 天之前(24小時)有更動過內容的檔案.也可以用 ctime 或是 atime.[root@benjr ~]# find /root -mtime 0 /root /root/.bash_history /root/test
-mtime 0 表示要搜尋當下的時間點, 24小時以內有變動過的檔案.
- -mtime +n
搜尋 n 天之前(不含 n 天本身)有更動過內容的檔案.也可以用 ctime 或是 atime.[root@benjr ~]# find /root -mtime +1 /root/.viminfo /root/.cache /root/.cache/dconf /root/.cache/dconf/user /root/.bashrc /root/diff.lst /root/.local /root/.local/share /root/.local/share/recently-used.xbel /root/.dbus /root/.dbus/session-bus /root/.dbus/session-bus/f07b3a3bf0b28d1c5a2bbdf95744e8fc-0 /root/.profile /root/new.lst
- -mtime -n
搜尋 n 天之內(含 n 天本身)被更動過內容的檔案.也可以用 ctime 或是 atime.[root@benjr ~]# find /root -mtime -1 /root /root/.bash_history /root/test
- -newer file
參數 -cnewer find 會依據 file 建立時間來搜尋.比 file 建立的時間還要新的檔案就會列出來.[root@benjr ~]# find /var/ftp -cnewer new.lst
參數 -cnewer find 會依據 new.lst 建立時間來搜尋出目錄 /var/ftp/ 中比 new.lst 時間還要新的檔案以及目錄,通常可以用於 Differential backup (差異備份) 時使用.除了 cnewer 外還有 anewer 可以使用.
剛剛的時間點都是以天來計算,還有以分鐘來計算的時間.
- -amin n
File was last accessed n minutes ago. - -cmin n
File’s status was last changed n minutes ago. - -mmin n
File’s data was last modified n minutes ago.
-
atime(Access): time of last access
find 的綜合應用
找出指定資料夾內有重覆的檔案 (問 ChatGPU 的)
透過 MD5 Sum 來比對檔案的 hash 值是否一致(代表檔案內容一樣).
# find /path/to/search -type f -exec md5sum {} + | sort | uniq -w32 -d --all-repeated=separate
One thought on “Linux command – find”