使用find查詢程式碼檔案的幾個示例
網上搜索find命令的用法,我去,全是什麼搜尋跟時間,跟許可權相關的用法,我TM不是運維也不是系統管理員,不要跟我講find的35種用法,我不關心這些啊。花了半天時間,N多篇關於find命令用法的文章看完,發現還是不能解決問題,只能說我愚鈍啊。我只想用find來查詢和檢視程式碼,誰懂我啊~~~
本篇主要是碼農的日常find
用法收集,所以,如果你是想基於各種時間,使用者和許可權等進行檔案查詢,抱歉,本篇並未涉及。
免不了囉嗦一下,“find”的常用的幾個選項:
-name
,按照指定檔名稱查詢-iname
,按照指定檔名稱查詢,並忽略大小寫-type
,按照指定檔案型別查詢-mindepth/maxdepth
-size
,指定查詢檔案大小-exec
,對查詢結果進行指定操作-a/-o
,多個條件合併查詢-prune
,指定排除查詢的條件
1. 使用檔名進行查詢
使用檔名查詢檔案
查詢
u-boot
目錄下包含rpi
的檔案:ygu@guyongqiangx:u-boot-2016.09$ find . -name *rpi* ./configs/rpi_2_defconfig ./configs/rpi_defconfig ./configs/rpi_3_defconfig ./configs/rpi_3_32b_defconfig ./board/raspberrypi/rpi ./board/raspberrypi/rpi/rpi.c ./include
這裡沒有指定只查詢檔案,所以搜尋結果中
./board/raspberrypi/rpi
是目錄。使用檔名查詢檔案,並忽略大小寫
查詢
rootfs
目錄下所有名為makefile
的檔案,並忽略大小寫:[email protected]:linux-3.14-1.5$ find rootfs -iname makefile ... rootfs/user/gptfdisk/makefile rootfs/user/snmpd/Makefile rootfs/user/snmpd/snmplib/Makefile rootfs/user/snmpd/modules/Makefile rootfs/user/snmpd/snmpd/Makefile rootfs/user/fileutils/Makefile rootfs/user/stty/Makefile rootfs/user/inetd/Makefile rootfs/user/cramfs/Makefile rootfs/user/cksum/Makefile rootfs/user/tftpd/Makefile rootfs/user/dhrystone/Makefile ...
使用檔名查詢檔案,並指定查詢目錄深度
查詢
rootfs
目錄和其一級子目錄下的makefile
ygu@guyongqiangx:linux-3.14-1.5$ find rootfs -mindepth 1 -maxdepth 2 -iname makefile rootfs/host/Makefile rootfs/Makefile rootfs/lib/Makefile rootfs/config/Makefile rootfs/user/Makefile
使用檔名查詢檔案,並在查詢結果上執行特定操作
查詢
rootfs
目錄下所有編譯生成的kernel檔案,並計算其md5
校驗和ygu@guyongqiangx:linux-3.14-1.5$ find rootfs -iname vmlinuz* -exec md5sum {} \; 928dba467dd79b8b554ff7c3db9eca95 rootfs/images/vmlinuz-7439b0 c82736b02abe048c633df0923b0ee521 rootfs/images/vmlinuz-initrd-7439b0
查詢
rootfs
目錄下所有編譯生成的kernel檔案,並重命名備份ygu@guyongqiangx:linux-3.14-1.5$ find rootfs -iname vmlinuz* -exec mv {} {}.bak.20170610 \; ygu@guyongqiangx:linux-3.14-1.5$ find rootfs -iname vmlinuz* rootfs/images/vmlinuz-initrd-7439b0.bak.20170610 rootfs/images/vmlinuz-7439b0.bak.20170610
查詢名為的
libmediaservice
資料夾$ ygu@guyongqiangx:972604/android$ find . -type d -name libmediaplayerservice ./frameworks/av/media/libmediaplayerservice
2. 忽略查詢中的錯誤資訊
將查詢中的錯誤資訊重定向到/dev/null
$ ygu@guyongqiangx:/local/users$ find . -type f -name android-6.0.1_*.tgz 2>/dev/null
$ find /etc -name auto.* -print 2>/dev/null
3. 按檔案大小進行查詢
查詢當前目錄下所有大於100MB的ISO檔案
[email protected]:/public/ygu$ find server -iname *.iso -size +100M
server/ubuntu-14.04.5-desktop-amd64.iso
server/ubuntu-16.04.2-desktop-amd64.iso
4. 對特定路徑模式的查詢
查詢所有路徑中包含tests的目錄下的*.dts檔案:
ygu@guyongqiangx:u-boot-2016.09$ find . -name *.dts -path "*/tests/*"
./test/py/tests/vboot/sandbox-kernel.dts
./test/py/tests/vboot/sandbox-u-boot.dts
選項-path "*/tests/*"
指定檔案路徑中包含tests
的檔案
查詢路徑中包含”tools”或”lib”的*.py檔案:
[email protected]:u-boot-2016.09$ find . -name *.py \( -path "*/dtoc/*" -o -path "*/lib/*" \)
./lib/libfdt/test_libfdt.py
./lib/libfdt/setup.py
./tools/dtoc/fdt_util.py
./tools/dtoc/fdt.py
./tools/dtoc/dtoc.py
./tools/dtoc/fdt_fallback.py
使用-o
連線兩個-path
選項限定查詢的路徑匹配模式(路徑包含”dtoc”或”lib”)。
5. 在find
結果中進行grep
操作
ygu@guyongqiangx:linux-3.14-1.5$ find linux -name "*.c" | xargs grep functionname
6. 使用-prune
進行排除性查詢
選項-prune
適用於排除性查詢,最初接觸find
命令時感覺較難。
之所以難理解,是因為我們一般習慣語法格式為-prune xxx
的用法,即在-prune
後跟xxx
來指明排除的條件,但實際上卻剛好相反,-prune
的排除條件需要寫在前面,我曾經為這個用法迷糊了好久。
這裡以Android中檔案build/envsetup.sh
內對find
的使用來看-prune
的用法:
指定檔案中進行
grep
function cgrep() { find . -name .repo -prune -o -name .git -prune -o -name out -prune -o -type f \( -name '*.c' -o -name '*.cc' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) \ -exec grep --color -n "[email protected]" {} + }
函式
cgrep
僅在當前目錄下C/C++相關的*.{c, cc, cpp, h, hpp}
字尾的檔案中進行grep
查詢:- 使用
-prune
排除多個目錄,條件‘-name .repo -prune’
,‘-name .git -prune’
,‘-name out -prune’
分別排除名稱為.repo
,.git
和out
的目錄,各個排除目錄的條件為”或”,使用‘-o’
連線 - 查詢多個字尾的檔名,條件
-name '*.c'
,-name '*.cc'
,-name '*.cpp'
,-name '*.h'
,-name '*.hpp'
分別包含字尾為*.{c, cc, cpp, h, hpp}
的檔案,各個查詢的檔名的條件為“或”,使用‘-o’
連線 - 對符合字尾的檔案中進行
grep
操作:-exec grep --color -n "[email protected]" {} +
對於
-exec
操作,有兩種形式:-exec command
-exec command {} +
這兩種操作的主要差別在+
上,沒搞懂有+
和沒有+
的區別,哪位大神來指導下?萬分感謝!
- 使用
查詢並匯入指定目錄下的
vendorsetup.sh
指令碼# Execute the contents of any vendorsetup.sh files we can find. for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \ `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \ `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` do echo "including $f" . $f done
以上操作會先檢查
{device, vendor, product}
目錄是否存在,如果存在,在其目錄下查詢vendorsetup.sh
檔案,並將其用.
操作包含到當前的命令列環境中來。-L
選項表示會進入符號連結內的資料夾下查詢-maxdepth 4
選項指定查詢深度不超過4層,所以自定義平臺vendorsetup.sh
指令碼的時候,存放深度不要太深了啊~~不然找不到哦~
godir
函式中查詢檔案,但忽略out
和.repo
目錄find . -wholename ./out -prune -o -wholename ./.repo -prune -o -type f > $FILELIST
這裡的
-wholename ./out
和-wholename ./.repo
等同於-path ./out
和-wholename ./.repo
,由於有-prune
字尾,所以相當於排除這兩個目錄
7. 一些練習
在linux目錄中查詢所有的*.h
,並在這些檔案中查詢“SYSCALL_VECTOR
”,最後打印出所有包含”SYSCALL_VECTOR
“的檔名
- 在標頭檔案中查詢”
SYSCALL_VECTOR
”
ygu@guyongqiangx:linux-3.14-1.5$ find linux -name *.h | xargs grep "SYSCALL_VECTOR"
linux/arch/x86/include/asm/irq_vectors.h:#define IA32_SYSCALL_VECTOR 0x80
linux/arch/x86/include/asm/irq_vectors.h:# define SYSCALL_VECTOR 0x80
linux/arch/m32r/include/asm/syscall.h:#define SYSCALL_VECTOR "2"
linux/arch/m32r/include/asm/syscall.h:#define SYSCALL_VECTOR_ADDRESS "0xa0"
- 只顯示包含”
SYSCALL_VECTOR
“的標頭檔案名
ygu@guyongqiangx:linux-3.14-1.5$ find linux -name *.h | xargs grep -l "SYSCALL_VECTOR"
linux/arch/x86/include/asm/irq_vectors.h
linux/arch/m32r/include/asm/syscall.h
grep
的-l
選項只顯示搜尋的檔名
我會根據讀程式碼時運用的find
操作,不定時對本文進行更新,十分歡迎大神秀出你的絕技,讓大家能夠受益。
相關推薦
使用find查詢程式碼檔案的幾個示例
網上搜索find命令的用法,我去,全是什麼搜尋跟時間,跟許可權相關的用法,我TM不是運維也不是系統管理員,不要跟我講find的35種用法,我不關心這些啊。花了半天時間,N多篇關於find命令用法的文章看完,發現還是不能解決問題,只能說我愚鈍啊。我只想用find來
使用grep搜尋程式碼的幾個示例
作為基於windows系統工作的攻城獅,每天必須用sourceinsight,這工具確實好用,關鍵詞和語法著色,上下文聯想,程式碼自動補全,但是也經常發現有些不太方便的地方。例如:操作前需要先建立工程,這也沒什麼,但是如果只想臨時在某個程式碼包裡查詢符號變數什麼的,也得需
一個完整的Java檔案的程式碼分幾個部分,每部分都起什麼作用,大致的寫法
package 當前類所在位置 import 當前類執行時所需要的包或類 public class 類名 { 屬性定義; 方法定義:
Java 程式設計師看scala 程式碼的幾個小問題
最近自己看Scala 的程式碼,有兩個小的的問題說一下 1:FPGrowth 中run的程式碼的引數是什麼,編譯器提示是Basket,但是根本沒有這個類。看了原始碼,就是在函式中定義了一個類似別名的class,其實是Iterable<T>。可以傳入的引數是比如JavaRDD<
SQL Server調優系列進階篇(查詢語句執行幾個指標值監測)
前言 上一篇我們分析了查詢優化器的工作方式,其中包括:查詢優化器的詳細執行步驟、篩選條件分析、索引項優化等資訊。 本篇我們分析在我們執行的過程中幾個關鍵指標值的檢測。 通過這些指標值來分析語句的執行問題,並且分析其優化方式。 通過本篇我們可以學習到調優中經常利用的幾個利器! 廢話少說,開始本篇的正題
查詢程式碼檔案中的非 ASCII 字元
在 Visual Studio 中編譯程式碼,報如下錯誤: warning C4819: The file contains a character that cannot be represented in the current code page (93
Linux中find命令和檔案三個時間簡介
在Linux中在終端上輸入命令stat +檔名 例如: 其中Access是該檔案中資料最後被訪問時間,比如被系統程序直接使用或者通過一些命令和指令碼間接使用。 Modity顯示的是檔案內容被改變時
VS2017寫程式碼時幾個常用的快捷鍵
說明:組合鍵是同時按,非組合鍵是按住Ctrl依次按後面的鍵 1.格式化 格式化全部程式碼 Ctrl+A+K+F 格式化選中的程式碼 Ctrl+K+F 2.註釋程式碼 註釋程式碼 Ctrl+K+C(comment)
find查詢多種檔案字尾
find命令最常用的是查詢某個檔案,如: find ./ -name "abc.txt" 則會在當前目錄及子目錄下查詢abc.txt檔案 更常用的是查詢某一型別的檔案,如: find ./ -name "*.txt" 則會在當前目錄及子目錄下查詢所有txt檔案,
【Linux】比較幾個檔案查詢命令 find-locate-whereis-which
Linux中的檔案查詢命令很多,今天先學習一下find、locate 、whereis、which。 先看一下這幾個命令的主要區別: linux命令中find、locate 、whereis、which均可用來查詢檔案,主要區別有: find是最常用和最強大的查詢命令
Linux 下幾個檔案操作命令的程式碼實現
用 C 語言實現命令 cp、df、mkdir、rm、tac 本文章中的示例程式碼是在 CentOS 5.4 64 位環境下執行通過的,在其它 unix 系統上沒有測試過。 Linux 作業系統中的命令實際上是編譯好的可執行程式,比如說 ls 這個命令,這個檔案位於 /bin
Linux 下幾個查詢命令 find,locate,whereis,which,type 總結
在 Linux 命令列下,常常根據需要進行相應檔案的查詢,有很多方法可以做到這一點,本次部落格對這些方法進行一個總結,可根據需要靈活運用。 1. find find 是最常見也是最強大的查詢命令,幾乎能滿足任何查詢需求。 find 命令使用格式: find 路徑
小米筆試題中遇到的關於學生成績查詢的幾個SQL語句
com 語句 關於 -1 sql 技術 筆試 試題 src 數據庫有三個字段,名字、學科、成績,如圖 1、 找出每科成績最高的學生的名字與分數 2、找出總分最高的學生名字與總分 3、找出三科成績均大於80分的學生 小米筆試題中遇到的關於學生成績查詢的幾個SQL語句
php中mysqli 處理查詢結果集的幾個方法
數值 集中 style 索引 php bsp 枚舉 tab object 最近對php查詢mysql處理結果集的幾個方法不太明白的地方查閱了資料,在此整理記下 Php使用mysqli_result類處理結果集有以下幾種方法 fetch_all() 抓取所有的結果行並且
數據庫基礎查詢語句中的幾個細節
語句 nvl 備註 nav 數據庫 數據庫基礎 細節 字符串 rom 運算 select 姓名列,工資列,工資列*12 from 表名 計算年薪 字符串拼接 irst_name||‘是‘||start_date||‘入職的,工資是‘||salary||‘,職位是
PHP時間戳的問題幾個小示例
北京時間 content date def 當前 時間戳 day 問題 獲得 <?php header("Content-type:text/html;charset=utf-8"); //設置北京時間為默認時區 date_default
wget命令的幾個常用選項和示例
一個 上下 由於 cnblogs 覆蓋 tmp pos ica 文件名 wget命令用來從指定的URL下載文件。wget非常穩定,它在帶寬很窄的情況下和不穩定網絡中有很強的適應性,如果是由於網絡的原因下載失敗,wget會不斷的嘗試,直到整個文件下載完畢。如果是服務器打斷下載
圖書管理系統的幾個簡單示例圖
活動圖 body log 業務 圖書管理 活動 class pos 技術 圖書館業務用例圖
幾個可以通過curl查詢公網IP的站點
數據 oot 查詢 OS class gpo fig 科技 config 通過命令行獲取公網ip 非常實用分享給大家實例: [root@T900 ~]# curl cip.cc IP : 119.29.29.29 地址 : 中國 廣東省 廣州市 運營商
linux下提高程式碼質量的幾個工具
1、測試程式碼覆蓋率 gcov 2、程式碼靜態測試 splint 3、記憶體洩漏測試 valgrind --tool=memcheck --leak-check=yes ./file 4、效能測試 gpro