Find總結及應用
搜索命令: locate命令: 在文件系統上查找符合條件的文件 非實時查找( 數據庫查找) :locate find: 實時查找
locate命令
查詢系統上預建的文件索引數據庫 /var/lib/mlocate/mlocate.db 依賴于事先構建的索引 剛剛創建的文件使用locate搜索不到,需要手動更新數據庫。 索引的構建是在系統較為空閑時自動進行(周期性 任務),管理員手動更新數據庫(updatedb) 索引構建過程需要遍歷整個根文件系統,極消耗資源 工作特點: ? 查找 速度 快 ? 模糊 查找 ? 非實時查找 ? 搜索的是文件的全路徑,不僅僅是文件名 ? 可能只搜索用戶具備讀取和執行權限的目錄 locate KEYWORD有用的選項 ? -i 執行區分大小寫的搜索 [root@localhost ~]# locate -i -n 5 /root/bin '*.SH$' /root/bin /root/bin/absum.sh /root/bin/argsnum.sh /root/bin/backup.sh /root/bin/checkint.sh ? -n N 只列舉前N 個匹配項目 [root@localhost ~]# locate -n 5 /root/bin '*.sh$' /root/bin /root/bin/absum.sh /root/bin/argsnum.sh /root/bin/backup.sh /root/bin/checkint.sh locate foo ? 搜索名稱或路徑中帶有“foo ”的文件 locate -r ‘\.foo$’ ? 使用Regex 來搜索以“.foo“結尾的文件 [root@localhost ~]# locate -r '\.foo$' /root/test.foo
find命令
實時查找工具,通過遍歷指定路徑完成文件查找; 工作特點: ? 查找速度略慢 ? 精確查找 ? 實時查找 ? 可能只搜索用戶具備讀取和執行權限的目錄
-
語法:
find [OPTION]... [ 查找路徑] [ 查找條件] [ 處理動作] 查找路徑:指定具體目標路徑;默認為當前目錄 查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件 處理動作:對符合條件的文件做操作,默認輸出至屏幕
-
查找條件
根據文件名和inode 查找: -name " 文件名稱" :支持使用glob *, ?, [], [^] [root@localhost ~]# find -name hostping* ./bin/hostping.sh ./bin/hostping2.sh 在不指定路徑的情況下,默認搜索當前目錄及其子目錄及其文件 -iname " 文件名稱" :不區分字母大小寫 [root@localhost ~]# find -iname "*.SH" ./bin/sumfile.sh ./bin/argsnum.sh ./bin/per.sh ./bin/nologin.sh ./bin/absum.sh ./bin/numsum.sh ./bin/filetype.sh ./bin/systeminfo.sh ./bin/backup.sh ./bin/disk.sh ./bin/links.sh ./bin/sumid.sh ./bin/sumspace.sh ./bin/hostping.sh ./bin/login.sh ./bin/hostping2.sh ./bin/createuser.sh ./bin/yesorno.sh ./bin/checkint.sh -inum n 按inode 號查找 [root@localhost ~]# ll -i total 16 201431364 drwxr-xr-x 2 root root 6 Jul 29 02:16 2016-07-29 201363477 -rw-------. 1 root root 2633 Jul 25 21:08 anaconda-ks.cfg 1111 drwxr-xr-x 2 root root 4096 Aug 15 12:01 bin 201382282 -rw-r--r-- 1 root root 62 Aug 15 11:09 f1 201382285 -rw-r--r-- 1 root root 614 Jul 29 04:07 fstab 201391491 -rw-r--r-- 1 root root 0 Aug 15 20:06 test.foo [root@localhost ~]# find -inum 201382285 ./fstab -samefile name 相同inode 號的文件 -links n 鏈接數為n 的文件 [root@localhost ~]# find -links 3 ./.cache ./.config [root@localhost ~]# ll ./.config total 4 drwxr-xr-x 2 root root 6 Jul 25 13:18 abrt -rw-r--r-- 1 root root 278 Jul 25 13:30 Trolltech.conf -regex "PATTERN" :以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名(使用的不是通配符,是正則表達式) [root@localhost ~]# find / -regex ".*\.sh" 根據屬主、屬組查找: -user USERNAME :查找屬主為指定用戶(UID)的文件 -group GRPNAME: 查找屬組為指定組(GID)的文件 -uid UserID :查找屬主為指定的UID號的文件 -gid GroupID :查找屬組為指定的GID號的文件 -nouser :查找沒有屬主的文件 -nogroup :查找沒有屬組的文件 多個選項一起的話空格隔開,默認就是并且的關系 根據文件類型查找: -type TYPE: ? f: 普通文件 ? d: 目錄文件 ? l: 符號鏈接文件 ? s :套接字文件 ? b: 塊設備文件 ? c: 字符設備文件 ? p: 管道文件 組合條件: 與:-a 或:-o 非:-not, ! 德· 摩根定律: (非 P) 或 (非 Q) = 非(P 且 Q) (非 P) 且 (非 Q) = 非(P 或 Q) 示例: !A -a !B = !(A -o B) !A -o !B = !(A -a B) 排除目錄 ? 示例:查找/etc/ 下,除/etc/sane.d 目錄的其它所有.conf后綴的文件 find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print find 要查找的目錄 -path 要排除的目錄 -a -prune -o -name 要找的文件 -print 打印 根據文件大小來查找: -size [+|-]#UNIT 常用單位:k, M, G #UNIT: (#-1, #] 如 :6k 表示(5k,6k] -#UNIT :[0,#-1] 如 :-6k 表示[0,5k] +#UNIT :(#, ∞ ) 如 :+6k 表示(6k ,∞ ) 根據時間戳: 以“天”為單位; -atime [+|-]#, #: [#,#+1) 如:7 [7,8)::過去的第七天到第八天 +#: [#+1, ∞ ] 如:+7 [8,∞)過去的第八天到過去的無窮遠天 -#: [0,#) 如:-7 [0,7) -mtime -ctime 以“分鐘”為單位: -amin -mmin -cmin 根據權限查找: -perm [/|-]MODE MODE: 精確權限匹配:八進制表示法642 /MODE :任何一類(u,g,o) 對象的權限中只要能一位匹配即可,或關系,+從centos7 開始淘汰 -MODE :每一類對象都必須同時擁有指定權限,與關系 0 表示不關注 ? find -perm 755 會匹配權限模式恰好是755 的文件 ? 只要當任意人有寫權限時,find -perm +222 就會匹配 ? 只有當每個人都有寫權限時,find -perm -222 才會匹配 ? 只有當其它人(other )有寫權限時,find -perm -002才會匹配
-
處理動作
-print :默認的處理動作,顯示至屏幕; -ls :類似于對查找到的文件執行“ls -l” 命令 -delete :刪除查找到的文件; -fls file :查找到的所有文件的長格式信息保存至指定文件中 -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND 指定的命令;{}表示搜索到的文件。 對于每個文件執行命令之前,都會交互式要求用戶確認 (exec可以全部執行命令指定的操作,不需要一個個確認操作) 例如:find -perm -222 -exec chmod o-w {} \; -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND 指定的命令 {}: 用于引用查找到的文件名稱自身 find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令 [root@localhost testc]# chmod a=wx ff{1..4} [root@localhost testc]# find /root/testc/ -perm -222 /root/testc/ff1 /root/testc/ff2 /root/testc/ff3 /root/testc/ff4 /root/testc/ff5 /root/testc/ff6 /root/testc/ff7 /root/testc/ff8 [root@localhost testc]# find /root/testc/ -perm -222 -ok chmod a=r {} \; < chmod ... /root/testc/ff1 > ? y < chmod ... /root/testc/ff2 > ? y < chmod ... /root/testc/ff3 > ? y < chmod ... /root/testc/ff4 > ? < chmod ... /root/testc/ff5 > ? < chmod ... /root/testc/ff6 > ? < chmod ... /root/testc/ff7 > ? < chmod ... /root/testc/ff8 > ? [root@localhost testc]# ll total 0 -r--r--r-- 1 root root 0 Aug 16 00:11 ff1 -r--r--r-- 1 root root 0 Aug 16 00:11 ff2 -r--r--r-- 1 root root 0 Aug 16 00:11 ff3 --wx-wx-wx 1 root root 0 Aug 16 00:11 ff4 -rw-rw-rw- 1 root root 0 Aug 16 00:11 ff5 -rw-rw-rw- 1 root root 0 Aug 16 00:11 ff6 -rw-rw-rw- 1 root root 0 Aug 16 00:11 ff7 -rw-rw-rw- 1 root root 0 Aug 16 00:11 ff8 [root@localhost testc]# find /root/testc/ -perm -222 -exec chmod a=r {} \; [root@localhost testc]# ll total 0 -r--r--r-- 1 root root 0 Aug 16 00:11 ff1 -r--r--r-- 1 root root 0 Aug 16 00:11 ff2 -r--r--r-- 1 root root 0 Aug 16 00:11 ff3 -r--r--r-- 1 root root 0 Aug 16 00:11 ff4 -r--r--r-- 1 root root 0 Aug 16 00:11 ff5 -r--r--r-- 1 root root 0 Aug 16 00:11 ff6 -r--r--r-- 1 root root 0 Aug 16 00:11 ff7 -r--r--r-- 1 root root 0 Aug 16 00:11 ff8 [root@localhost testc]# 有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題 find | xargs COMMAND [root@localhost ~]# find /root/testc/ -perm -222 | xargs chmod a+x [root@localhost ~]# ll /root/testc/ total 0 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff1 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff2 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff3 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff4 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff5 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff6 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff7 -rwxrwxrwx 1 root root 0 Aug 16 00:11 ff8
-
1、查找/var目錄下屬主為root,且屬組為mail的所有文件 [root@localhost ~]# find /var -user root -group mail/var/spool/mail [root@localhost ~]# 2、查找/var目錄下不屬于root、lp、gdm的所有文件 [root@localhost ~]# find /var -not \( -user root -o -user lp -o -user gdm \) -ls 3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件 [root@localhost ~]# find /var -not \( -user root -o -user postfix \) -mtime -7/var/log/cups /var/spool/mail/tom /var/spool/mail/alice2 /var/spool/mail/alice3 /var/spool/mail/alice5 4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件 [root@localhost ~]# find / \( -nouser -nogroup \) -atime -7find: ‘/proc/1840/task/1840/fd/6’: No such file or directory find: ‘/proc/1840/task/1840/fdinfo/6’: No such file or directory find: ‘/proc/1840/fd/6’: No such file or directory find: ‘/proc/1840/fdinfo/6’: No such file or directory /home/alice2 /home/alice2/.mozilla /home/alice2/.mozilla/extensions /home/alice2/.mozilla/plugins /home/alice2/.bash_logout /home/alice2/.bash_profile /home/alice2/.bashrc 5、查找/etc目錄下大于1M且類型為普通文件的所有文件 [root@localhost ~]# find /etc -size +1M -type f/etc/selinux/targeted/policy/policy.29/etc/udev/hwdb.bin [root@localhost ~]# 6、查找/etc目錄下所有用戶都沒有寫權限的文件 [root@localhost ~]# find /etc -not -perm /222 -ls 7、查找/etc目錄下至少有一類用戶沒有執行權限的文件 [root@localhost ~]# find /etc -not -perm -111 -ls 8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件 [root@localhost ~]# find /etc/init.d -perm -113 -ls134305318 0 lrwxrwxrwx 1 root root 11 Jul 25 20:05 /etc/init.d -> rc.d/init.d
原創文章,作者:dxkboke,如若轉載,請注明出處:http://www.www58058.com/36330
文章對find的常見用法比較詳細,但是實驗部分的例子不太清晰,我們做實驗時先有一個問題,而后通過實驗區驗證我們的想法要知道自己在干什么。