find、xargs、grep

find

find命令用於:在一個目錄(及子目錄)中搜索文件,你能夠指定一些匹配條件,如按文件名、文件類型、用戶甚至是時間戳查找文件。linux

find命令通常簡化形式(還能夠更復雜,更多操做) find [path...] [expression]正則表達式

path:find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄shell

 

touch一些測試文件express

$ ls
hello.cpp  kg.lua  kobebryant  Kobe.lua

安全

參考:http://tiger-hu.iteye.com/blog/1927754bash

按名字查找

-name 和 -iname的區別在於前者對大小寫敏感,後者不敏感性能

$ find . -name "k*"
./kobebryant
./kg.lua

測試

$ find . -iname "k*"
./kobebryant
./Kobe.lua
./kg.lua

ui

 

按時間查找

 -atime  -n[+n]: 找出文件訪問時間在n日以內[以外]的文件。
    -ctime  -n[+n]: 找出文件更改時間在n日以內[以外]的文件。
    -mtime -n[+n]: 找出修改數據時間在n日以內[以外]的文件。
    -amin   -n[+n]: 找出文件訪問時間在n分鐘以內[以外]的文件。
    -cmin   -n[+n]: 找出文件更改時間在n分鐘以內[以外]的文件。
    -mmin  -n[+n]: 找出修改數據時間在n分鐘以內[以外]的文件。
lua

好比:找出一天內修改文件

$ find -ctime -1
.
./hello.cpp
./kobebryant
./Kobe.lua
./kg.lua

基於找到的文件執行操做

 -exec: 對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {} \;,注意{}和\;之間的空格,同時兩個{}之間沒有空格。特別注意:分號是必須打,做爲-exec的結束符
 -ok:  其主要功能和語法格式與-exec徹底相同,惟一的差異是在於該選項更加安全,由於它會在每次執行shell命令以前均予以提示,只有在回答爲y的時候, 其後的shell命令纔會被繼續執行。須要說明的是,該選項不適用於自動化腳本,由於該提供可能會掛起整個自動化流程。

好比:找出60分鐘內修改的文件,並執行ls -l ,也就是顯示出詳情

$ find . -cmin -60 -exec ls -l {} \;
總用量 0
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:29 hello.cpp
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 kg.lua
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 kobebryant
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 Kobe.lua
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:29 ./hello.cpp
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./kobebryant
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./Kobe.lua
-rw-rw-r-- 1 philosophie philosophie 0 8月   5 22:27 ./kg.lua

好比:找出kg爲首的文件,提示刪除

$ find . -name "kg*" -ok rm {} \;
< rm ... ./kg.lua > ? y
$ ls
hello.cpp  kobebryant  Kobe.lua

按文件所屬的owner和group查找:
    -user:      查找owner屬於-user選項後面指定用戶的文件。
    ! -user:    查找owner不屬於-user選項後面指定用戶的文件。
    -group:   
查找group屬於-group選項後面指定組的文件。
    ! -group: 查找group不屬於-group選項後面指定組的文件。

好比

$ find . -user philosophie
.
./hello.cpp
./kobebryant
./Kobe.lua

按指定目錄深度查找

-maxdepth: 後面的參數表示距當前目錄指定的深度,其中1表示當前目錄,2表示一級子目錄,以此類推。在指定該選項後,find只是在找到指定深度後就不在遞歸其子目錄了。下例中的深度爲1,表示只是在當前子目錄中搜索。若是沒有設置該選項,find將遞歸當前目錄下的全部子目錄。

$ mkdir hhh

$ cd hhh/

$ touch h.c

$ find . -maxdepth 1 -name "*"    # 當前目錄找不到 h.c
.
./hello.cpp
./kobebryant
./hhh
./Kobe.lua


$ find . -maxdepth 2 -name "*"  # 1級子目錄找到了h.c
.
./hello.cpp
./kobebryant
./hhh
./hhh/h.c
./Kobe.lua

按文件權限屬性查找

補充:文件權限,分別爲 全部者、所在組、其餘組,八進制數字

$ ll
總用量 12
drwxrwxr-x 3 philosophie philosophie 4096 8月   5 23:56 ./
drwxrwxr-x 3 philosophie philosophie 4096 8月   5 22:26 ../
-rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:29 hello.cpp
drwxrwxr-x 2 philosophie philosophie 4096 8月   5 23:57 hhh/
-rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:27 kobebryant
-rw-rw-r-- 1 philosophie philosophie    0 8月   5 22:27 Kobe.lua

$ find . -perm 664
./hello.cpp
./kobebryant
./hhh/h.c
./Kobe.lua

$ find . -perm 775
.
./hhh

按文件類型查找

 -type:後面指定文件的類型。
    b - 塊設備文件。
    d - 目錄。
    c - 字符設備文件。
    p - 管道文件。
    l  - 符號連接文件。
    f  - 普通文件。

$ mkdir kkk

$ find . -type d
.
./kkk
./hhh
$ find . -type d -name "h*"
./hhh

按文件大小查找

-size [+/-]100[c/k/M/G]: 表示文件的長度爲等於[大於/小於]100塊[字節/k/M/G]的文件。
 -empty: 查找空文件。

好比,查找文件大小爲0的文件能夠這樣寫

-size [+/-]100[c/k/M/G]: 表示文件的長度爲等於[大於/小於]100塊[字節/k/M/G]的文件。
    -empty: 查找空文件。

好比

$ find . -size 0 -exec ls -l {} \;
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./b
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./a

也能夠

$ find . -empty -exec ls -l {} \;
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./b
-rw-rw-r-- 1 philosophie philosophie 0 8月 6 10:30 ./a

 

按更改時間比指定文件新或比文件舊的方式查找

-newer file

好比,查找比b更新的文件,也就是更晚建立的文件

$ find . -newer b

查找不比b更新的文件,輸出會包括文件b

$ find . ! -newer b

 

xargs

背景:在使用find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec執行。但有些系統對可以傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘以後,就會出現溢出錯誤。

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

在有些系統中,使用-exec選項會爲處理每個匹配到的文件而發起一個相應的進程,並不是將匹配到的文件所有做爲參數一次執行;這樣在有些狀況下就會出現進程過多,系統性能降低的問題,於是效率不高; 而使用xargs命令則只有一個進程。

 

好比:找到全部普通文件,並測試每一個文件是什麼類型的

$ find . -type f -print|xargs file
./b: empty
./c: empty
./a: empty
./t.sh: a /bin/bsah script, ASCII text executable
./hello.lua: ASCII text

grep 

參考:http://blog.csdn.net/zhushuai1221/article/details/53097008

grep (global search regular expression(RE) and print out the line 全局搜索正則表達式並把行打印出來。

做用:它能使用正則表達式搜索文本,並把匹配的行打印出來。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不一樣。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把全部的字母都看做單詞。

Linux使用GNU版本的grep。它功能更強,能夠經過-G、-E、-F命令行選項來使用egrep和fgrep的功能。

經常使用的grep選項有:

-c   只輸出匹配行的計數。
-i   不區分大小寫。
-h   查詢多文件時不顯示文件名。
-l   查詢多文件時只輸出包含匹配字符的文件名。
-n   顯示匹配行及行號。
-s   不顯示不存在或無匹配文本的錯誤信息。
-v   顯示不包含匹配文本的全部行。

 

好比:

將utils.lua出現local的行取出來

 

$ grep local utils.lua
local TableDB = require('.TableDB')
local M = {}

顯示出來的同時顯示行號

$ grep -n local utils.lua
2:local TableDB = require('.TableDB')
3:local M = {}

我這裏顯示出的local是標記了紅色的,本來應該不是默認這樣的,要使得查找的關鍵字的顯示顏色應該要這樣寫

grep -n --color=auto 'local'

可是之因此默認這樣是由於~/.bashrc這個文件配置過了,以下

 

將匹配的行的前2行後3行也打印出來,就拿bashrc這個文件爲例,找出配置了grep的地方。(後面的grep不用引號也是能夠的)

$ cat ~/.bashrc | grep -n -A3 -B2 'grep'
80- #alias vdir='vdir --color=auto'
81-
82: alias grep='grep --color=auto'
83: alias fgrep='fgrep --color=auto'
84: alias egrep='egrep --color=auto'
85-fi
86-
87-# colored GCC warnings and errors

 

按文件的內容查找文件

# grep ‘energywise’ *           #在當前目錄搜索帶'energywise'行的文件  

# grep -r ‘energywise’ *        #在當前目錄及其子目錄下搜索'energywise'行的文件  

# grep -l -r ‘energywise’ *     #在當前目錄及其子目錄下搜索'energywise'行的文件  

 

正則表達式

之後再弄

相關文章
相關標籤/搜索