1. 程式人生 > >馬哥學習--李洋個人筆記之條件判斷test及文件查找find

馬哥學習--李洋個人筆記之條件判斷test及文件查找find

test find

pstree -p 查看當前終端的進程樹.

test命令

長格式的例子:
test "$A" == "$B" && echo "Strings are equal"
test “$A” -eq “$B” && echo "Integers are equal"

兩個==是表示兩個字符串是否完全相同的意思,-eq是兩個數字是否相等的意思。

簡寫格式的例子:
[ "$A" == "$B" ] && echo "Strings are equal"

[ "$A" -eq "$B" ] && echo "Integers 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