Shell 命令 find grep xargs 學習

jopen 9年前發布 | 11K 次閱讀 Linux Shell

find命令

find命令用于在一個目錄(及子目錄)中搜索文件, 可以指定匹配條件, 如文件名, 文件類型

在Mac下有強大的Spotlight和Alfred(感覺window下的everything更牛叉), 所以find用的就比較少了

</div>

find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]

</div>

常用形式為:

# path表示 find 命令查找的目錄路徑

$ find [path] [expression]

# 查找當前路徑下的所有git為前綴的文件, 這里*被稱為通配符

find . -name 'git*'

# 查找當前路徑下所有以.txt和.pdf為后綴的文件

$ find . \( -name "*.txt" - o -name "*.pdf" \) - print

# !表示否則, 查找所有不是以.txt為后綴的文件

$ find . ! -name "*.txt" - print

# 按類型搜索, 只所有目錄( f 表示文件 l 表示符號鏈接(軟鏈接) d 表示目錄)

$ find . - type d - print

# 按用戶搜索 找到所有andrew_liu的用戶文件

$ find . - type f -user andrew_liu - print

# 按照時間搜索 -atime - 30 m 搜索 30 分鐘內被訪問的文件(后面有詳細解釋)

$ find . -atime - 30 m - type f - print

# -atime + 30 m 搜索超過 30 分鐘被訪問的文件

$ find . -atime + 30 m - type f - print

# 找到以.txt為后綴的文件后刪除

$ find . - type f -name "*.txt" - delete

</div>

按時間搜索(這些元數據都在inode的結構體中有記錄)

  • atime 訪問時間 (單位有一周w, 一天d, 一小時h, 一分鐘m, 一秒s, 以下類似)
  • mtime 修改時間 (內容被修改)
  • ctime 變化時間 (元數據或權限變化)
  • </ul>

    grep命令

    grep命令是強大的文本搜索命令

    </div>

    • grep全稱是globally search a regular expression and print, 表示全局正則表達式匹配并輸出, 它的使用權限是所有用戶
    • 存在很多grep的修改版, 例如agrep表示近似的grepapproximate grep用于模糊字符串搜索, fgrep用于固定樣式搜索fixed pattern searches, 而egrep用于搜索更復雜的正則表達式語法(摘自wiki)
    • </ul>

      使用格式: grep [options] match_patten file

      </div>

      option這里值列舉幾個常用的選項, 其他可以使用man grep進行查看

      • -c:只輸出匹配行的次數
      • -l:查詢多文件時只輸出包含匹配字符的文件名
      • -n:顯示匹配行及行號
      • -v:顯示不匹配行
      • -i:搜索時忽略大小寫
      • -l:只打印包含匹配行的文件名
      • -e:指明一個查找模式(常用多一次匹配多個查找模式)
      • -R:遞歸的查找多級目錄
      • </ul>

        # 匹配test.doc文件中所有存在hello的行

        $ grep 'hello' test.doc

        # 匹配test.doc文件中所有存在hello的行, 并打印行號

        $ grep -n 'hello' test.doc

        # 找到所有行不匹配hel或者how, -e匹配多個模式

        $ grep -v -e 'hel' -e 'how' test.doc

        # 在多級目錄中對文本遞歸搜索

        $ grep "class" . - R -n

        #輸出結果:

        ./test/ class . c :1: class

        ./test/ class . c :2: class yes

        ./test/ class . c :4: class fuck

        ./test. doc: 5 :class

        ./test. pdf: 1 :class

        # 找到所有以.hel開頭的行, 并使用管道命令

        $ cat test.doc | grep '^\.hel'

        # 找到所有包含hel行的行數(只輸出行數, 沒有內容)

        cat test.doc | grep -c 'hel'

        # 更多使用選項使用

        $ man grep

        </div>

        關于正則表達式的學習可以看 Python正則表達式

        xargs命令