find 和 grep 的結合使用

1, grep find and xargs 結合
用grep命令在當前目錄下的Makefile文件中搜索libTsCommon.a這個詞:
[leo@leo streamer]$ find . -name 'Makefile' -print | xargs grep "libTsCommon.a"
./libTsCommon/Makefile:lib_target  = $(TARGET)/libTsCommon.a
./libTsCommon/Makefile:auto_test_target  = $(TARGET)/libTsCommon-autotest

搜索誰使用了libTsCommon.a  打包文檔文件
[leo@leo streamer]$ find . -name "Makefile" |  xargs grep "TsCommon"
./libTsCommon/Makefile:# Makefile for extension/streamer/libTsCommon
./libTsCommon/Makefile:lib_target  = $(TARGET)/libTsCommon.a
./libTsCommon/Makefile:auto_test_target  = $(TARGET)/libTsCommon-autotest
./libTsCommon/Makefile:INTERFACE_PATH  = media/libTsCommon
./libTsCommon/Makefile:INTERFACE_LIBS  = TsCommon
./ts-hw-elements/Makefile:REQUIRES += extension/streamer/libTsCommon
./payload-sink-elements/Makefile:REQUIRES += extension/streamer/libTsCommon
./dvr-hw-elements/Makefile:REQUIRES += extension/streamer/libTsCommon
./ts-elements/Makefile:REQUIRES += extension/streamer/libTsCommon
./ts-elements/Makefile:$(auto_test_target): LDFLAGS := $(filter-out -lTsCommon,$(LDFLAGS))


2, find grep and -exec 結合
[leo@leo streamer]$ find . -name "Makefile" -exec grep "libTsCommon.a" {} \;
lib_target  = $(TARGET)/libTsCommon.a
auto_test_target  = $(TARGET)/libTsCommon-autotest


使用find時,只要把想要的操作寫在一個文件裏,就可以用exec來配合find查找,很方便的

在有些操作系統中只允許-exec選項執行諸如l s或ls -l這樣的命令。大多數用戶使用這一選項是爲了查找舊文件並刪除它們。建議在真正執行rm命令刪除文件之前,最好先用ls命令看一下,確認它們是所要刪除的文件。

exec選項後面跟隨着所要執行的命令或腳本,然後是一對兒{ },一個空格和一個\,最後是一個分號。爲了使用exec選項,必須要同時使用print選項。如果驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。

例如:爲了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec選項中

# find . -type f -exec ls -l {  } \;
-rw-r--r--    1 root     root        34928 2003-02-25  ./conf/httpd.conf
-rw-r--r--    1 root     root        12959 2003-02-25  ./conf/magic
-rw-r--r--    1 root     root          180 2003-02-25  ./conf.d/README


-exec 參數後面跟的是 command命令,注意點如下:

command命令的終止,使用 ';' (分號)來判定,在後面必須有一個 ';'

'{}',使用{}來表示文件名,也就是find前面處理過程中過濾出來的文件,用於command命令進行處理

特別強調,對於不同的系統,直接使用分號可能會有不同的意義, 使用轉義符 '\'在分號前明確說明,對於前面我們遇到的問題,主要就是這個原因引起的!

舉例:

1.查詢所有保護字符串“Hello”的文件

find / -exec grep "Hello" {} \;

2.刪除所有臨時文件

find / -name "*.tmp" -exec rm -f {} \;

 

 

3, -exec 與 xargs的區別

在使用find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現 溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。

find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。

在有些系統中,使用-exec選項會爲處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作爲參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;

而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。

來看看xargs命令是如何同find命令一起使用的,並給出一些例子。

下面的例子查找系統中的每一個普通文件,然後使用xargs命令來測試它們分別屬於哪類文件

#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory: ISO-8859 text\

用grep命令在所有的普通文件中搜索hostname這個詞:

# find . -type f -print | xargs grep "hostname"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞:

# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:# different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
發佈了19 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章