1. 程式人生 > >使用find查詢程式碼檔案的幾個示例

使用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
    /configs/rpi.h

    這裡沒有指定只查詢檔案,所以搜尋結果中./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.gitout的目錄,各個排除目錄的條件為”或”,使用‘-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“的檔名

  1. 在標頭檔案中查詢”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"
  1. 只顯示包含”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