馬哥學習--李洋個人筆記之條件判斷test及文件查找find
test命令
長格式的例子:
test "$A" == "$B" && echo "Strings are equal"
test “$A” -eq “$B” && echo "Integers are equal"
兩個==是表示兩個字符串是否完全相同的意思,-eq是兩個數字是否相等的意思。
簡寫格式的例子:
[ "$A" == "$B" ] && echo "Strings are equal"
-v 用來檢測一個變量是否被設置過值,若設置過則$?返回0,沒設置過值返回1.
數值測試:
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
這些數值測試可以是整數或負數,甚至算數表達式來比較。但不支持小數點。
test有一個專用的命令中括號
左中括號[ 是一個命令,空格加右中括號是它的參數
具體如下:
[ A ==A ]
echo $?
0
也就是[ A ==A ] 等於 test "$A" == "$A".
字符串測試
字符串測試:註意: 此表達式一般用於[[ ]]中;擴展的正則表達式
== 是否等於 示例: [[ a == b ]]中, a == b 與中括號之間都有空格.
ascii碼是否大於ascii碼
< 是否小於
!= 是否不等於
=~ 左側字符串是否能夠被右側的PATTERN所匹配 即 左側字符串是否包含右側的,包含為真,不包含為假.
註意:用於字符串比較時的用到的操作數都應該使用引號
-z "STRING“ 字符串是否為空,空為真,不空為假,舉例
A=123
[ -z $A ]
echo $?
1
-z是當變量有值的時候為假,沒有被賦值的時候為真.
-n "STRING“ 字符串是否不空,不空為真,空為假,舉例
A=123
[ -z $A ]
echo $?
0
-n是當變量有值的時候為真,沒有被賦值的時候為假.
存在性測試
-a FILE:同-e FILE:
文件存在性測試,存在為真,否則為假
[ -e /etc/passwd ]等於test -e /etc/passwda 等於test -a /etc/passwda
echo $?
0
存在性及類別測試
-b FILE:是否存在且為塊設備文件
-c FILE:是否存在且為字符設備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或 -L FILE:存在且為符號鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件
權限測試
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
[ -r /app/passwd -o -w /app/passwd ] 判斷/app/passwd文件是否存在,並擁有讀或寫的權限. 不能寫為 -rw
[ -r /app/passwd -a -w /app/passwd ] 判斷/app/passwd文件是否存在,並擁有讀和寫的權限. 不能寫為 -rw
文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
文件大小測試:
-s FILE: 是否存在且非空
文件是否打開:
-t fd: fd 文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取之後是否被修改過
-O FILE:當前有效用戶是否為文件屬主
-G FILE:當前有效用戶是否為文件屬組
雙目測試:
FILE1 -ef FILE2: FILE1是否是FILE2的硬鏈接
FILE1 -nt FILE2: FILE1是否新於FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊於FILE2
多條件判斷.並且,或者,非..
第一種方式:
COMMAND1 && COMMAND2 並且 &&等於 -a
COMMAND1 || COMMAND2 或者 ||等於 -o
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]] 等於 [ -r /app/passwd -a -w /app/passwd ]
[[ -r FILE ]] || [[ -w FILE ]] 等於 [ -r /app/passwd -o -w /app/passwd ]
第二種方式:
條件1 -a 條件2 並且
條件1 -o 條件2 或者
! EXPRESSION
必須使用測試命令進行,即test或[]
文件查找
locate 基於數據庫來查找文件,是非及時性查找。通過數據庫文件數據庫位置 /var/lib/mlocate/mlocate.db來進行
更新,使用updatedb命令可以更新數據庫。
locate 的搜索,只會依賴於事先構建的索引,索引的構建是在系統較為空閑時自動進行(周期性任務)。索引構建後的
數據,不會立即生效,需要管理員手動更新數據庫(updatedb)。索引構建過程需要遍歷整個根文件系統,極消耗資源。
locate特點:
1 查找速度快
2 模糊查找 包含關鍵字的也會顯示
3 非實時查找 只會基於上一次的索引,除非管理員手動更新數據庫(updatedb)
4 搜索的是文件的全路徑,不僅僅是文件名 包含關鍵字的路徑也會被顯示出來。
5 可能只搜索用戶具備讀取和執行權限的目錄 如果要搜索的用戶沒有對a目標有rx權限,那麽a目標不會顯示。
(rx,x代表能進,r代表能列)
locate +關鍵字
– -i 不區分大小寫的搜索
– -n N 只列舉前N個匹配項目 示例: -n 2 表示只顯示結果的前兩個。
– -r 使用正則表達式
示例:
搜索名稱或路徑中帶有“conf”的文件 locate conf
使用Regex(正則表達式)來搜索以“.conf”結尾的文件
locate -r ‘.conf$’
find查找工具 實時查找工具,通過遍歷指定路徑完成文件查找 如果什麽條件都不指定,則將當前目錄及子目錄的
所有文件都列出來。
工作特點:
1 查找速度略慢
2 精確查找
3 實時查找
4 可能只搜索用戶具備讀取和執行權限的目錄 如果要搜索的用戶沒有對a目標有rx權限,那麽a目標不會顯示。
(rx,x代表能進,r代表能列)
語法:
find [OPTION]... [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄,且會遞歸。
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件具體有如下幾種:
搜索層級 默認全部遞歸,不管被搜索的目錄是幾層都會全部遞歸。
-maxdepth level 最大搜索目錄深度,指定目錄為第1級
-mindepth level 最小搜索目錄深度
示例:
find -maxdepth 3 -name yangyang
查找當前目錄下名為yangyang的文件,但最多遞歸3層。這三層包含.(.是當前目錄)
find -mindepth 2 -name yangyahg
查找當前目錄下名為yangyang的文件,但最少遞歸2層。這二層不包含.(.是當前目錄)
只在第n層目錄內查找
find -maxdepth 2 -mindepth 2 -name yangyahg
只在當前目錄的第二層查找名為yangyang的文件。
根據文件名和inode查找:
-name "文件名稱":支持使用glob(通配符) *, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數為n的文件 任何一個目錄的鏈接數至少是2,因為有.(當前目錄)和..(上個目錄)兩個鏈接
所以可以得出,目錄的硬鏈接數減去2,就是這個目錄的子目錄數量。
-regextype posix-extended -regex "PATTERN(正則表達式)":以PATTERN匹配整個文件路徑字符串,而
不僅僅是文件名稱
find /app -regextype posix-egerp -regex ‘/app/.(r..t)...\1er‘ 前後的目錄必須一致,否則報錯.
查找app目錄下,前後名字都有r..t且一致的文件
root555rooter
find -regextype posix-extended -regex ‘./.(r..t)...\1er‘是擴展正則,
./aroot123rooter
-regextype posix-basic -regex 是基本正則.
-regextype posix-egerp -regex意思是使用和egrep一樣的正則表達式。
根據屬主、屬組查找:
-user USERNAME:查找屬主為指定用戶(UID)的文件
find -user yangyang
查找屬主是yangyang的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
find -group li
查找屬組是li的文件。
-uid UserID:查找屬主為指定的UID號的文件
-gid GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件 因為用戶被刪除,所以看不到用戶名了,但uid號還在的文件用此辦法查看
-nogroup:查找沒有屬組的文件 因為組被刪除,所以看不到組名了,但gid號還在的文件用此辦法查看
根據文件類型查找: -type TYPE:
f: 普通文件 示例 # find -type f # 顯示所有普通文件
d: 目錄文件
l: 符號鏈接文件 即軟鏈接
s:套接字文件 即網絡端口通信文件。
b: 塊設備文件
c: 字符設備文件 顯示終端信息。
p: 管道文件
組合條件查找
組合條件:默認是與的關系,即-a
與:-a 或:-o 非:-not, ! !-a = -o (非與即或 )!-o = -a(非或即與)
條件1 -a 條件2 同時滿足這兩個條件
條件1 -o 條件2 滿足其中給一個即可
(非 A)或(非 B) =非(A且 B)
(非 A)且(非 B) =非(A或 B)
!A-a !B = !(A-o B) 非條件1與非條件2 等於 非(條件1或條件2)
!A-o !B = !(A-a B) 非條件1和非條件2 等於 非(條件1或條件2)
條件1 -o 條件2 相當於數學中的並集
條件1 -a 條件2 相當於數學中的交集
find -not -name 條件1 -a -not -name 條件2,用基本正則可寫為
#find -not ( -name 條件1 -o -name 條件2 )
find示例
find -name snow.png
查找當前目錄下,名字精確為snow.png的文件,區分大小寫
find -iname snow.png
查找當前目錄下,名字精確為snow.png的文件,不區分大小寫
find /-name “*.txt”
查找根目錄下,名字精確以.txt結尾的文件
find /var–name “log”
查找var目錄下,名字包含log的文件.
find -user joe -group joe
查找當前目錄下,屬主為joe,且屬組為joe的文件
find -user joe -not -group joe
查找當前目錄下,屬主為joe,且屬組不是joe的文件.
find -user joe -o -user jane
查找當前目錄下,屬主是joe或jine的文件
find -not( -user joe -o -user jane )
查找根目錄下的,屬主不是joe和jine的文件
find / -user joe -o -uid 500
查找根目錄下,屬主是joe或UID號為500的文件.
找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp ( -not -user root -a -not -name ‘f‘ ) -ls
find /tmp -not ( -user root -o -name ‘f‘ ) -ls
排除目錄示例:固定格式: -path ‘目錄名’ -a -prune 排除一個指定目錄
查找/etc/下,除/etc/sane.d目錄的其它所有.conf後綴的文件
find /etc -path ‘etc/sane.d‘ -a -prune -o -name ‘*.conf‘
查找/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的其它所有.conf後綴的文件
find /etc ( -path ‘/etc/sane.d‘ -o -path ‘etc/fonts‘ ) -a -prune -o -name "*.conf"
根據文件大小來查找:
-size [+|-]#UNIT
常用單位:k, M, G,c(byte)
輸入單位#: (#-1, #] 大於等於#-1,到小於#之間。 中括號有大於等於的意思。小括號有小於的意思.
如:6k 表示(5k,6k] 5K到6K之間。
輸入單位 -#:[0,#-1] 大於等於0.小於等於#-1
如:6k 表示[0,5k]
輸入單位 +#:(#,∞) 大於等於#+1到正無限大,不包含輸入的數值本身。
如:+6k 表示(6k,∞)
示例:
查找大於5M的文件 # find -size +5M
查找小於5M的文件 # find -size -6M
查找大於5M,小於6M的文件 # find -size 5M
附:創建指定大小的文件
dd if=/dev/zero of=/app/bigfile.img bs=1M count=5 bs是指定塊的大小,count是塊的個數。
在/app/下創建了一個名為bigfile.img且大小為5M的文件。
根據時間戳:
以“天”為單位; -atime [+|-]#, -atime 最近一次的訪問時間
#: [#,#+1) #到#+1天前之間。 -mtime 最近一次的修改時間
+#: [#+1,∞] #+1天之前。 -ctime 最近一次的狀態時間(權限,用戶,組,大小,修改時間等)
-#: [0,#) #天以內。
-mtime -ctime 示例:查找app/目錄下,10分鐘之內時間戳發生改變的文件.
find /app -amin -10
以“分鐘”為單位:
-amin -mmin -cmin
根據權限查找: -perm [/|-]MODE (因為+從centos7開始淘汰,centos7裏面只能用/來表示.)
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,是或的關系 舉例:
挑選出當前目錄下.屬主或屬組或其他人權限上有寫權限的文件.
find -perm /666
屬主上有r,rw,w權限之一的, 或 屬組上有r,rw,w權限之一的 或 其他人上有r,rw,w權限之一的的都會被匹配到.
r,rw,w三者滿足其中之一即可,屬主,屬組,其他人只要有一項滿足這些條件之一都符合.
PS: 如果是find -perm /000的話,只有/000才能匹配的到.
-MODE:每一類對象都必須同時擁有指定權限,是與的關系 舉例:
挑選出當前目錄下.屬主,屬組,其他人權限上都有寫權限的文件.
find -perm -222
屬主上有w rw,wx權限 且 屬組上有w rw,wx權限 且 其他人上有w rw,wx權限的才會被匹配到.
三者之間必須同時滿足條件才會被匹配到.
0 表示不關註,權限位為0的時候,使用或()關系判斷的時候,會判斷其他的權限位置.
使用與(-)關系判斷的時候,有一處權限位不符合都不會再判斷.
rw------- 1
-----w---- 2
-------wx 3
r-------- 4
find -perm 600
會匹配到1和4.
因為6裏面包括r和w,屬主上包括r的只有1和4,而屬組和其他上都是0,
0表示不關心,故2和3雖然分別在其他人及屬組上有符合的條件,但是不匹配.
同理,如果匹配項是022的話,值會匹配2和3.
find -perm 755 會匹配權限模式恰好是755的文件,與的關系時,僅匹配755.
或的關系時候,任何一位上滿足條件都會列出.
只要當任意人有寫權限時,find -perm +222就會匹配
只有當每個人都有寫權限時,find -perm -222才會匹配
只有當其它人(other)有寫權限時,find -perm -002才會匹配
查找後的處理動作: 通常放在命令最後
-print:默認的處理動作,顯示至屏幕
-ls:類似於對查找到的文件執行“ls -l”命令
-delete:刪除查找到的文件
fls file:查找到的所有文件的長格式信息保存至指定文件中
主要保存inode號,軟鏈接次數,權限,之類的信息類似於ls -l後,顯示的內容。
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前
,都會交互式要求用戶確認
固定格式
find -name ".sh" -exec chmod +x {} \;,將查找出來 .sh 的文件加上執行權限x.
其中 -exrc和\;是固定格式,分別代表開始和結束,exec後面跟命令,{}當中固定引用參數。
這裏引用的參數就是 "*.sh"
對當前目錄下,所有f開頭的文件做一個備份,備份名字為文件名.orig
find -name "f*" -exec cp {} {}.orig \;
第一個{}是引用“f*”變量,第二個{}代表在當前目錄下建立備份.orig。
如果將 -exec 改為 -OK 的話,那麽電腦會在每一步都會發出詢問。
參數替換:xargs
find和xargs格式:find | xargs COMMAND(命令)
由於很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令
xargs用於產生某個命令的參數,xargs 可以讀入 stdin(標準輸入) 的數據,並且以空格符或回車符將 stdin
的數據分隔成為arguments(參數)
註意:文件名或者是其他意義的名詞內含有空格符的情況
有些命令不能接受過多參數,命令執行可能會失敗,xargs可以解決
示例:
ls f* |xargs rm 刪除列出的文件
find /sbin -perm +700 |ls -l 這個命令是錯誤的,ls不支持接受管道傳遞過來的參數.
find /sbin -perm +7000 | xargs ls –l
echo “a b c d e” |xargs touch
相當於touch a b c d e xargs當中的參數,會一個一個的交給它後面的命令。
find -name “*.conf” -exec cp {} {}.orig \;
備份配置文件,添加.orig這個擴展名
find /tmp -ctime +3 -user joe -ok rm {} \;
提示刪除存在時間超過3天以上的joe的臨時文件,-ok會每一步都提醒。
find ~ -perm -002 -exec chmod o-w {} \;
在你的家目錄中尋找可被其它用戶寫入的文件,並去除掉這個權限。
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
在/date目錄下的普通文件。權限為644且以。sh結尾的,給這寫文件的權限改為755.
find /home –type d -ls
列出家目錄下的目錄文件。
馬哥學習--李洋個人筆記之條件判斷test及文件查找find