find
字符串類查詢:
-type //根據文件類型查找
f:普通文件
d:目錄
c:字符文件
b:塊設備
s:套接字文件
p:命名管道
-i:忽略大小寫
-name , -iname //按文件名查找
-path , -ipath //按路徑名查找
-regex , -iregex //使用正則表達式
例:
# 要十分注意這類模糊查詢,在腳本中一定要加引號,否則Gi*會被替換為所有以Gi開頭的文件,導致find報錯誤,說沒有指定查找路徑。 find ${BINDIR} -name "Gi*" -exec md5sum {} \; # 找出文件名 或 路徑中含有 script字樣的所有文件 及 路徑,并忽略大小寫。 find . -ipath "*script*" # 查找當前目錄下以.py 或.sh結尾的文件 find . -iregex ".*\(\.py\|\.sh\)$"
-inum //通過文件或目錄的inode查找
例:
linux有時會遇到一些很難操作的文件名,這時可用ls -i看它到inode,在用find找到這個inode對應的文件,在刪除。
find / -inum 1002910 -exec rm {} \; # {}:大括號是前面-inum參數找到的所有文件。
-prune : 修剪掉指定目錄;即過濾指定目錄。
例:搜索當前目錄下除目錄名為etc的目錄外,其它目錄的所有文件。
find . \( -name "etc" -prune \) -o \( -type f -print \) # -maxdepth 指定查找的目錄最大深度 # -mindepth 指定查找的目錄最小深度。 find / -maxdepth 2 -type f find / -mindepth 3 -type f
數字類查找:
-size # 與:-and , -a # 找大于3M 并且 小于4M的文件 find / -size +3000k -and -size -4000k # 或:-or , -o find / -size -3000k -or -size +4000k # 非:-not , ! --------------------------------------------------- 兩個條件沒有指定邏輯關系時,默認使用“與” -not A -a -not B 等價于 -not(A -o B) -not A -o -not B 等價于 -not(A -a B) -------------------------------------------------- 例: # 查找/etc目錄下最近一周內其內容修改過,且屬主不為root或hadoop的所有文件; find /etc/ ! \( -user root -a -user hadoop \) -mtime -7 -ls # 等價于 find /etc/ ! -user root -o ! -user hadoop -mtime -7 -ls # 查找/etc目錄下所有用戶都沒有寫權限的文件;【注:權限匹配請看下面關于如何計算權限匹配的說明】 find /etc ! \( -perm -222 -o -perm -220 -o -perm -200 -o -perm -022 -o -perm -002 -o -perm -020 -o -perm -202 \) -ls # 等價于 find /etc ! -perm -222 -a ! -perm -220 -a ! -perm -200 -a ! -perm -022 -a ! -perm -002 -a ! -perm -020 ! -perm -202 -ls 以天為單位: -atime -mtime -ctime 以分鐘為單位: -amin -mmin -cmin 示例: # -5指定是 當前時間 - 5天之間 被訪問的都找出來。 find / -atime -5 # +5指的是 5天前往更久遠的所有時間,只要文件內容被修改都會被找到。 find / -mtime +5 # 表示從當前時間向后數5個24小時,5就是第5個24小時的整點處,屬性信息被改變過的所有文件。 find / -ctime 5
----------------------------------|5|---------------------------------|當前時間| |---------->[ +5:5天前 ]<---------| |------------>[ -5 :5天內] <------| # 注:find計算5天的方式是:從當前時間開始向前延伸24小時為一天,5天就是5個24小時, 若指定為 5 ,則表示從當前時間向后數5個24小時,5就是第5個24小時的整點處。
要驗證可用下面腳本測試:
cat find.sh #!/bin/bash date 100118002014.02 # 修改時間為10月1號18:00:02 touch a.txt # 創建文件 echo "File Create Complete!!" date 100418002014.00 # 修改時間為10月4號18:00:00 echo "Now : October 4 ; Script Complete!!" find /root -mtime -3 | grep "a.txt" # 1號18:00:02 到 4號18:00:00 之間跨度為:3天差2秒 # 設置找mtime為 3天內修改的文件,3天 包含 2天23個小時58秒 # 故 可測出find 按時間找的時候就是按 24小時為一天算的。
權限類查找:
用戶和組查找
-uid 按用戶的UID來查找文件或目錄
-user 和 -group 按指定用戶或組來查找文件或目錄
-nouser 和 -nogroup 它們可以找出系統中所有文件的owner丟失的文件,owner丟失可能是文件所有者被刪除或是通過NIS這種網絡用戶登陸后,創建的文件。
示例:
# 找出test創建的所有文件 find / -user test find / -group mysql # 監控系統中owner丟失的文件【{}:大括號是前面-nouser參數找到的所有文件?!? find / -nouser -exec chown root:root {} \;
權限查找
find / -perm 777
示例:
監控文件系統中other欄位存在write權限的文件和目錄。
find / -type f -perm -2 -->它可找出系統中所有other權限中包含write的文件。 【注意:權限 + 是做 or 運算, - 是做 and 運算。 -perm -2: 指的是other欄中包含write權限的意思, -22: 就是Group和Other兩欄中都有write權限的意思。 -222: 就是全部包含write權限的意思。 】
find /etc/ ! -perm -111 -ls //查找/etc目錄下至少有一類用戶沒有執行權限的文件 --------------------------------------- 合并后的權限 sst rwx rwx rwx 0000----------000 000 000 000 0001----------000 000 000 001 0011----------000 000 001 001 0100----------000 001 000 000 0110----------000 001 001 000 0010----------000 000 001 000 0101----------000 001 000 001 and(-) 0111----------000 001 001 001 - - - 結果 ? ? ? -----------------------------------------
結果:每中權限組合與0111做與運算時,都為False.因此通過排除這個權限,就可以得到非0111權限的所有文件。
對SUID和SGID的監控:
【要關閉FileSystem上的SUID和SGID就在掛載FS時,加上nosuid這個參數即可?!?br /> # 文件的權限為具有SUID和SGID的。通過這個命令可從系統中找出所有SUID和SGID的文件,可用來進行對
SUID和SGID文件的監控。
find / -type f -perm +6000
—————————————
合并后的權限 sst rwx rwx rwx
2000———-010 000 000 000
4000———-100 000 000 000
6000———-110 000 000 000
6660———-110 110 110 000 //我們關注的SUID和SGID因此其他尾其實可以忽略
or(+)
6000———-110 000 000 000
– –
結果 11
———————————–
結果:6000通過與所有可能的權限做或運算,我們可知它每種情況都為True。
注意:因為我們只想找SUID和SGID被設置的文件,其他權限是什么我不關心.
-ls:類似于ls -l顯示詳細信息
-exec COMMAND {} \;
例:
測試方法:
useradd abc su - abc cd /tmp mkdir abc cd abc touch abc.txt abc.conf abc.pdf su - root userdel abc find /tmp -nouser -nogroup -fprintf /root/waining.txt '%AD %AT %-10s %n %p %u %#m\n' -exec chown root.root {} \; # 或: -exec mv {} /root/waindir/ \; # 注: %AD :輸入到文件的日期格式 %AT:輸入到文件的時間格式 # %-10s : 文件大小 # %n : 硬連接 # %p : 權限 %#m :權限細節 %u :用戶UID
注:一次性查找符合條件的所有文件,并一同傳遞給-exec或-ok后面指定的命令;
但有些命令不能接受過長的參數;此時使用另一種方式: find … | xargs COMMAND
————————————————-
關于xargs的一些用法提示:
echo a b c | xargs -n 1 echo # xargs每次接受1個值,并將值傳給 echo輸出。 echo a b c | xargs -n 2 echo # xargs每次接受2個值,并將值傳給 echo輸出。 echo a b c | xargs echo # 一次接受所有的值,并將值傳給 echo輸出。 cut -d ':' -f 1 /etc/passwd | xargs -i -e'mail' -p -n2 echo cut -d ':' -f 1 /etc/passwd | xargs -i[ -e'mail' -p -n2 echo [ # -i 后面可指定 代替符 ,如:[, {}, 等 # -e'mail' :指定已mail為結束標志,注意-e后面的參數不能有空格 ; # -p:詢問 # -n2:指定一次傳幾個參數給 后面的命令。
原創文章,作者:Wn1m,如若轉載,請注明出處:http://www.www58058.com/8122
123456789 echo a b c | xargs -n 1 echo # xargs每次接受1個值,并將值傳給 echo輸出。
格式怎么弄得
@huwei:不好意思,這段時間工作有點多。 我沒看明白你要說什么?
例下面的格式是怎么弄得,看起來比較舒服,條理清晰