Linux下查找命令 —— find、grep、 which、 whereis、 locate


 

find命令

基本格式

find < path > < expression > < cmd >
'''
path: 所要搜索的目錄及其所有子目錄。默認為當前目錄。
expression: 所要搜索的文件的特征。
cmd: 對搜索結果進行特定的處理。
如果什么參數也不加,find默認搜索當前目錄及其子目錄,並且不過濾任何結果(也就是返回所有文件),將它們全都顯示在屏幕上。
'''

 

find命令常用選項及實例

  • -name 按照文件名查找文件。
    find /dir -name filename # 在/dir目錄及其子目錄下面查找名字為filename的文件
    find . -name "*.c" # 在當前目錄及其子目錄(用“.”表示)中查找任何擴展名為“c”的文件
  • -perm 按照文件權限來查找文件。
    find . -perm 755 –print # 在當前目錄下查找文件權限位為755的文件,即文件屬主可以讀、寫、執行,其他用戶可以讀、執行的文件
  • -prune 使用這一選項可以使 find 命令不在當前指定的目錄中查找,如果同時使用 -depth 選項,那么 -prune 將被 find 命令忽略。
    find /apps -path "/apps/bin" -prune -o –print # 在/apps目錄下查找文件,但不希望在/apps/bin目錄下查找
    find /usr/sam -path "/usr/sam/dir1" -prune -o –print # 在/usr/sam目錄下查找不在dir1子目錄之內的所有文件
  • -depth:在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。
    find / -name "CON.FILE" -depth –print # 它將首先匹配所有的文件然后再進入子目錄中查找
  • -user 按照文件屬主來查找文件。
    find ~ -user sam –print # 在$HOME目錄中查找文件屬主為sam的文件
  • -group 按照文件所屬的組來查找文件。
    find /apps -group gem –print # 在/apps目錄下查找屬於gem用戶組的文件
  • -mtime -n +n 按照文件的更改時間來查找文件, -n 表示文件更改時間距現在n天以內,+n 表示文件更改時間距現在 n 天以前。
    find / -mtime -5 –print # 在系統根目錄下查找更改時間在5日以內的文件
    find /var/adm -mtime +3 –print # 在/var/adm目錄下查找更改時間在3日以前的文件
  • -nogroup 查找無有效所屬組的文件,即該文件所屬的組在 /etc/groups 中不存在。
    find / –nogroup -print
  • -nouser 查找無有效屬主的文件,即該文件的屬主在 /etc/passwd 中不存在。
    find /home -nouser –print
  • -newer file1 ! file2 查找更改時間比文件 file1 新但比文件 file2 舊的文件。
  • -type 查找某一類型的文件,
    • 諸如:
    • b - 塊設備文件。
    • d - 目錄。
    • c - 字符設備文件。
    • p - 管道文件。
    • l - 符號鏈接文件。
    • f - 普通文件。
      find /etc -type d –print # 在/etc目錄下查找所有的目錄
      find . ! -type d –print # 在當前目錄下查找除目錄以外的所有類型的文件
      find /etc -type l –print # 在/etc目錄下查找所有的符號鏈接文件
  • -size n[c] 查找文件長度為 n 塊的文件,帶有 c 時表示文件長度以字節計。
    find . -size +1000000c –print # 在當前目錄下查找文件長度大於1 M字節的文件
    find /home/apache -size 100c –print # 在/home/apache目錄下查找文件長度恰好為100字節的文件
    find . -size +10 –print # 在當前目錄下查找長度超過10塊的文件(一塊等於512字節)
  • -mount:在查找文件時不跨越文件系統 mount 點。
    find . -name “*.XC” -mount –print # 從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件(不進入其他文件系統)
  • -follow:如果 find 命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件
  • -exec,find 命令對匹配的文件執行該參數所給出的 shell 命令。相應命令的形式為 ’command’ {} \;,注意 {} 和 \; 之間的空格
    $ find ./ -size 0 -exec rm {} \; # 刪除文件大小為零的文件
    $ rm -i `find ./ -size 0`
    $ find ./ -size 0 | xargs rm -f &
    # 為了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec選項中: $ find . -type f -exec ls -l {} \; # 在/logs目錄中查找更改時間在5日以前的文件並刪除它們: find /logs -type f -mtime +5 -exec rm {} \;
  • -ok,和 -exec 的作用相同,只不過以一種更為安全的模式來執行該參數所給出的 shell 命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
    find . -name "*.conf" -mtime +5 -ok rm { } \; # 在當前目錄中查找所有文件名以.LOG結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示
# 查找當前路徑下的所有普通文件,並把它們列出來。
find . -type f -exec ls -l {} \;

# 刪除logs目錄下更新時間為5日以上的文件。
find logs -type f -mtime +5 -exec rm {} \;

# 刪除當前路徑下以。log結尾的五日以上的文件,刪除之前要確認。
find . -name "*.log" -mtime +5 -ok rm {} \;

# 查找$HOME目錄下suid位被設置,文件屬性為755的文件打印出來。
find ~ -type f -perm 4755 -print

#說明: find在有點系統中會一次性得到將匹配到的文件都傳給exec,但是有的系統對exec的命令長度做限制,就會報:”參數列太長“,這就需要使用xargs。xargs是部分取傳來的文件。

# xargs測試文件分類
find / -type f -print |xargs file

# 將core文件信息查詢結果報存到core。log日志
find . -name "core*" -print|xargs echo " ">/tmp/core.log

7. find / -type f -print | xargs chmod o -w

8. find . -name * -print |xargs grep "DBO"
一些常用命令

 

grep命令

基本格式

grep [選項] pattern [文件名]

 

命令中的選項為:

'''
-? 同時顯示匹配行上下的?行,如:grep -2 pattern filename 同時顯示匹配行的上下2行。
-b,—byte-offset 打印匹配行前面打印該行所在的塊號碼。
-c,—count 只打印匹配的行數,不顯示匹配的內容。
-f File,—file=File 從文件中提取模板。空文件中包含0個模板,所以什么都不匹配。
-h,—no-filename 當搜索多個文件時,不顯示匹配文件名前綴。
-i,—ignore-case 忽略大小寫差別。
-q,—quiet 取消顯示,只返回退出狀態。0則表示找到了匹配的行。
-l,—files-with-matches 打印匹配模板的文件清單。
-L,—files-without-match 打印不匹配模板的文件清單。
-n,—line-number 在匹配的行前面打印行號。
-s,—silent 不顯示關於不存在或者無法讀取文件的錯誤信息。
-v,—revert-match 反檢索,只顯示不匹配的行。
-w,—word-regexp 如果被\<和>引用,就把表達式做為一個單詞搜索。
-V,—version 顯示軟件版本信息。
'''
View Code
ls -l | grep '^a' 通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
grep 'test' d* 顯示所有以d開頭的文件中包含test的行。
grep 'test' aa bb cc 顯示在aa,bb,cc文件中匹配test的行。
grep '[a-z]' aa 顯示所有包含每個字符串至少有5個連續小寫字符的字符串的行。
grep 'w(es)t.*' aa 如果west被匹配,則es就被存儲到內存中,並標記為1,然后搜索任意個字符(.*),這些字符后面緊跟着另外一個es(),找到就顯示該行。如果用egrep或grep -E,就不用""號進行轉義,直接寫成'w(es)t.*'就可以了。
grep -i pattern files :不區分大小寫地搜索。默認情況區分大小寫
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整個單詞,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
grep -C number pattern files :匹配的上下文分別顯示[number]行,
grep pattern1 | pattern2 files :顯示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :顯示既匹配 pattern1 又匹配 pattern2 的行。
例子

 

pattern為所要匹配的字符串,可使用下列模式

  • . 匹配任意一個字符
  • * 匹配 0 個或多個 * 前的字符
  • ^ 匹配行開頭
  • $ 匹配行結尾
  • [] 匹配 [ ] 中的任意一個字符,[] 中可用 - 表示范圍,
  • 例如 [a-z] 表示字母 a 至z 中的任意一個
  • \ 轉意字符

 

xargs命令

基本格式

xargs定位參數位置 | xargs控制參數位置 | 如何定位控制xargs參數位置

 

背景:
  管道 + xargs 用於把上游輸出轉換為下游參數輸入。
  例如 ls *.bak | xargs rm -f

問題:

  xargs默認把輸入作為參數放到命令的最后,但是很多命令需要自己定位參數的位置,比如拷貝命令 cp {上游結果} destFolder

解決方法:

  xargs 使用大寫字母i 定義參數指示符 -I <指示符>,然后用這個參數指示符定位參數插入的位置, 例如:

ls *.bak | xargs -I % cp % /tmp/test
# 這里使用%作為指示符,第一個%可以理解為聲明,第二個%可以理解為調用。你也可以用其他字符,比如 ls *.bak | xargs -I {} cp {} /tmp/test

 

  之所以能用到 xargs 這個命令,關鍵是由於很多命令不支持 | 管道來傳遞參數,而日常工作中有有這個必要,所以就有了 xargs 命令,例如:

find /sbin -perm +700 | ls -l # 這個命令是錯誤的
find /sbin -perm +700 | xargs ls -l # 這樣才是正確的


  xargs 可以讀入 stdin 的資料,並且以空白字元或斷行字元作為分辨,將 stdin 的資料分隔成為 arguments 。 因為是以空白字元作為分隔,所以,如果有一些檔名或者是其他意義的名詞內含有空白字元的時候, xargs 可能就會誤判了~

選項解釋

  • -0 當sdtin含有特殊字元時候,將其當成一般字符,像/ ‘ 空格等
    echo "//"|xargs echo
    echo "//"|xargs -0 echo
    # /
  • -a file 從文件中讀入作為 sdtin
    cat test#!/bin/shecho "hello world/n"
    xargs -a test echo#!/bin/sh echo hello world/n
  • -e flag ,注意有的時候可能會是 -E,flag 必須是一個以空格分隔的標志,當 xargs 分析到含有 flag 這個標志的時候就停止。
    cat txt # /bin tao shou kun
    cat txt|xargs -E 'shou' echo # /bin tao
  • -p 當每次執行一個 argument 的時候詢問一次用戶。
    root@localhost:~/test#cat txt|xargs -p echoecho /bin tao shou kun ff ?...y # /bin tao shou kun ff
  • -n num 后面加次數,表示命令在執行的時候一次用的 argument 的個數,默認是用所有的
    cat txt|xargs -n1 echo
    '''
    /bin
    tao
    shou
    kun
    '''
    
    cat txt|xargs echo # /bin tao shou ku
  • -t 表示先打印命令,然后再執行。
    cat txt|xargs -t echoecho /bin tao shou kun #/bin tao shou kun
  • -i 或者是 -I,這得看 linux 支持了,將 xargs 的每項名稱,一般是一行一行賦值給 {},可以用 {} 代替。
    ls | xargs -t -i mv {} {}.bak
  • -r no-run-if-empty 當 xargs 的輸入為空的時候則停止 xargs,不用再去執行了。
    echo ""|xargs -t -r mv
  • -s num 命令行的最大字符數,指的是 xargs 后面那個命令的最大命令行字符數
    cat test |xargs -i -x -s 14 echo "{}"
    '''
    exp1
    exp5
    file
    xargs: argument line too long
    linux-2
    '''

     

  • -L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
  • -l 同-L
  • -d delim 分隔符,默認的 xargs 分隔符是回車,argument 的分隔符是空格,這里修改的是 xargs 的分隔符
    cat txt |xargs -i -p echo {}echo /bin tao shou kun ?...y
    cat txt |xargs -i -p -d " " echo {}echo /bin ?...y
    '''
    echo tao ?.../bin
    y
    echo shou ?...tao
    '''
    
    # 再如:
    cat test |xargs -i -p -d " " echo {}echo exp1
    '''
    exp5
    file
    linux-2
    ngis_post
    tao
    test
    txt
    xen-3
    ?...y
    '''
    cat test |xargs -i -p echo {}echo exp1 ?...y
    '''
    echo exp5 ?...exp1
    y
    echo file ?...exp5
    '''
    y
  • -x exit 的意思,主要是配合 -s 使用。
  • -P 修改最大的進程數,默認是1,為0時候為 as many as it can

 

其他查找命令

1. locate命令
  locate 命令其實是 “find -name” 的另一種寫法,但是要比后者快得多,原因在於它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含有本地所有文件信息。Linux 系統自動創建這個數據庫,並且每天自動更新一次,所以使用 locate 命令查不到最新變動過的文件。為了避免這種情況,可以在使用 locate 之前,先使用 updatedb 命令,手動更新數據庫。

locate命令的使用實例:

# 搜索etc目錄下所有以sh開頭的文件。
$ locate /etc/sh

# 搜索用戶主目錄下,所有以m開頭的文件,並且忽略大小寫。
$ locate -i ~/m


2. whereis命令
  whereis 命令只能用於程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。

whereis 命令的使用實例:

$ whereis grep
# grep: /bin/grep /usr/share/man/man1p/grep.1p.gz /usr/share/man/man1/grep.1.gz


3. which命令
  which 命令的作用是,在 PATH 變量指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果。也就是說,使用 which 命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。

which 命令的使用實例:

$ which grep
# /bin/grep

 



參考文章:https://blog.csdn.net/wzzfeitian/article/details/40985549

 

 

 

              


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM