本文主要介紹了lsof, find, xargs命令的基本用法。
lsof命令lsof:list open files 列出已經打開的文件,文件可以是一個普通文件、目錄、特殊的塊文件、特殊的字符文件、可執行的文件、lib庫文件、socket文件等。
用法:
lsof [options] [filename]
案例:
- lsof test.txt 表示顯示打開test.txt文件的進程;
- lsof -c string 查找lsof顯示結果中COMMAND列中包含string的程序所打開的文件;這裡可以有多個-c,來顯示多個進程打開的文件;
- lsof -p 33321 列出進程号為33321的進程打開的文件
- lsof -g 0 顯示屬于gid為0這個組成員所打開的文件
- lsof -u root|0 顯示root用戶(或是指定的UID的用戶)所有打開的文件。
- lsof -u ^root 表示列出不屬于root用戶打開的文件;
- lsof d /tmp 顯示/tmp目錄下被打開的文件,注意這個隻會在當前目錄下找,不會去找指定目錄的子目錄。
- lsof D /usr/local 這個是在/usr/local目錄及其子目錄中去尋找已經打開了的文件
- lsof -d 4 顯示正在使用文件描述符為4的進程
- lsof -a -u root -c mysqld表示顯示root用戶運行的mysqld程序打開的所有文件。-a表示and的意思,是兩個條件都要滿足
- lsof -i [46][protocol][@hostname|hostaddr][:service|port]顯示指定的網絡地址所屬的進程打開的文件列表。[]中的内容為可選項
4|6表示的是要匹配的網絡地址是ipv4,還是ipv6的
protocol表示網絡地址所使用的傳輸層協議,有效值為TCP、UDP(不區分大小寫)
hostname|hostaddr主機名或主機地址
service表示定義在/etc/services文件中的服務名稱
port表示網絡地址中的端口部分
例如:
lsof -i [email protected]:22
通過遍曆指定目錄中的所有文件查找,查找的條件豐富。
用法:find 查找路徑 查找條件 查找到後的動作
查找路徑:就是指在哪個路徑中進行查找
查找條件
- -name ‘filename’ 是精确查找;區分大小寫;
- -iname ‘filename’在查找的時候不區分文件名的大小寫;
- -regex PATTERN 基于正則表達式來進行文件名的查找;
- -user username 查找屬于username用戶的文件;
- -group groupname 查找屬于groupname組的文件;
- -gid gid 查找屬于組id為gid的文件;
- -uid uid 查找屬于用戶id為uid的文件;
- -nouser 查找不屬于任何用戶的文件,即沒有屬主的文件;
- -nogroup 查找沒有屬組的文件;通常在用戶和組都被删除了的情況,這裡該用戶的屬主和屬組為删除的這個用戶的生前uid,gid
- -type type 根據文件的類型來查找;type可能有的值如下:
f 普通文件
d 目錄
c 字符設備
b 塊設備
l 鍊接文件
p 管道設備
s 套接字文件
- -size { |-}n{k|M|G} 根據文件的大小來查找;
10k 表示文件大小大于10k
-20M 表示文件大小小于20M,
10k 表示查找大小為10k的文件;
如果沒有指定單位則默認是byte字節;
如果沒有 或-,則表示精确匹配;
當要把多個查找條件組合起來的時候,要使用到下面的邏輯關系:
-a 表示并且;
-o 表示或;
-not 表示非;
默認情況下是 –a 也就是“并且”
根據文件的時間屬性來查找:
-atime { |-}num
-mtime { |-}num
-ctime { |-}num
num 表示查找那些atime、mtime、ctime離此刻剛好有num天的文件;
-num 表示查找那些atime、mtime、ctime離此刻剛好在num天之内的文件;
num 表示查找那些atime、mtime、ctime離此刻至少有num天,也就是說num天之外的文件;
可以使用下面的這張圖來說明:
-amin 最近訪問過的時間,以分鐘為單位;
-mmin 最近修改過的時間,以分鐘為單位;
-cmin 最近改變過的時間,以分鐘為單位;
-perm MODE 根據文件的權限來查找;755之類的 這是精确匹配,也就是說文件的權限必須是MODE,不多也不能少;
-perm /MODE 也是根據文件的權限來查找,隻不過,隻要有一個可以匹配,就算到找到的範圍内;
-perm -MODE 每一位都必須匹配;也就是說當文件的權限完全包含MODE的時候,就算數;
-inum n 根據指定的文件的inode号來查找文件;可以用來删除那些中文亂碼的文件。
先使用ls -li來找到亂碼文件的inode,然後再使用find /path/ -inum x -exec rm -rf {} \; 這樣就可以删除該文件了;
查找後的動作:
-print 默認動作,打印出來;
-ls 類型ls –l的形式來顯示找到的文件的信息;
-ok command {} \; 在執行command的時候會提示用戶是否執行,一定要寫上\;結尾,{}是引用找到的那個文件,可以引用多次;
-exec command {} \; 同上,但是在執行command 的時候是不會提示用戶的;
xargs命令xargs - 從标準輸入接收命令并執行;
xargs 從标準輸入讀入參數,這些參數以空格、單雙引号或者一個新行作為分隔符,然後xargs就會用後面的命令(默認是echo)帶上這些參數來執行;從标準輸入讀入的空行将會被忽略;
由于類unix文件系統中文件名稱可以包括空格、換行等特殊字符,所以默認的操作還是有些問題的。文件名中有空格、/和換行符的将不能被xargs正确的處理,考慮到這種情況,最好是使用-0 選項,它可以避免這些問題。當使用這個選項的時候,你必須确保為xargs産生參數的程序所産生的參數,必須也是以空字符來作為他隔符的。如果是用find為xargs産生參數,那麼可以在find中使用-print0。
如果任何一個調用的命令以255狀态碼退出,那麼,xargs将會立即停止,将不會讀取後面的參數,并且會在标錯誤輸出上顯示錯誤信息。
案例:
- 把/tmp目錄下,以.test結尾的普通文件全部删除。
# find /tmp -name ‘*.test’ -type f | xargs rm -f {}
上面這個命令隻會删除文件名稱中沒有空格或是換行符的文件。像’a b.test’這個文件它是删除不了的。
- 再看下面這個命令:
# find /tmp -name ‘*.test’ -type f -print0 | xargs -0 rm -rf
這個命令就會把/tmp下面所以有.test結尾的文件全部删除;
,