## find
### 格式
```
find 路徑 -命令參數 [輸出形式]
```
路徑:告訴find在哪兒去找你要的東西
命令參數:參考下面
輸出形式:輸出形式很多,-print,-printf,-print,-exec,-ok,-ls等等。
### 參數說明
-name 按照文件名查找文件。
-perm 按照文件權限來查找文件。
-user 按照文件屬主來查找文件。
-prune 使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用了- depth選項,那么-prune選項將被find命令忽略。
-group 按照文件所屬的組來查找文件。
-mtime -n +n 按照文件的更改時間來查找文件, -n表示文件更改時間距現在n天以內,+n表示文件更改時間距現在n天以前,如果是n的話就表示距離現在的第n天。find命令還有-atime和-ctime選項,但它們都和-mtime選項相似,所以我們在這里只介紹-mtime選項。
-nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
-nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改時間比文件file1新但比文件file2舊的文件。
-type 查找某一類型的文件,諸如:
b - 塊設備文件。
d - 目錄。
c - 字符設備文件。
p - 管道文件。
l - 符號鏈接文件。
f - 普通文件。
s - socket文件
-size n[c] 查找文件長度為n塊的文件,帶有c時表示文件長度以字節計。
-depth 在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。
-fstype 查找位于某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件
/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息。
-mount 在查找文件時不跨越文件系統mount點。
-follow 如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio 對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。
### 輸出形式
-exec find命令對匹配的文件執行該參數所給出的其他linux命令。相應命令的形式為' 命令 - and' {} \;注意{ }和\;之間的空格。它的終止是以;為結束標志的,所以這句命令后面的分號是不可缺少的,考慮到各個系統中分號會有不同的意義,所以前面加反斜杠。{} 花括號代表前面find查找出來的文件名。
-ok 和- exec的作用相同,只不過會和人交互而已,OK執行前會向你確認是不是要執行。
### 常用范例
```
# 在$HOME中查.txt文件并顯示
find ~ -name "*.txt"
# 查以大寫字母開頭的文件
find . -name "[A-Z]*"
# 查以兩個小寫字母和兩個數字開頭的txt文件
find . -name "[a-z][a-z][0–9][0–9].txt"
# 查755權限的文件
$find . -perm 755
# 查找774權限的文件并對其執行 ls l的命令
find . - perm 774 -exec ls l {} \;
# 目錄設置為750
find /www -type d -exec chmod 750 {} \;
# 設置非目錄的文件為并設置為640
find /www ! -type d -exec chmod 640 {} \;
# 查找大于10Mb的文件
find / -size +10000k
# 查找昨天修改的文件(只是昨天)
find / -mtime 1
# 將查找到的文件刪除
find / -name *.php -exec rm -i {} \;
# 查找在當前目錄中,不在以aaa結尾的目錄中的,不以gz結尾的文件
find . -name "*.gz" -prune -o \( \! -name aaa \)
# 查找5分鐘以內修改過的文件
find . -mmin -5
# 查找更改時間比文件log2012.log新但比文件log2017.log舊的文件
find -newer log2012.log ! -newer log2017.log
# 查找更改時間在比log2012.log文件新的文件
find . -newer log2012.log -print
# find命令從文件系統的根目錄開始,查找一個名為CON.FILE的文件。
find / -name "CON.FILE" -depth -print
# 在使用find命令時,可能希望先匹配所有的文件,再在子目錄中查找。使用depth選項就可以使find命令這樣做。這樣做的一個原因就是,當在使用find命令向磁帶上備份文件系統時,希望首先備份所有的文件,其次再備份子目錄中的文件。
# 搜索文件,并只顯示文件名,以升序排列。
find ./ -name "null_*" -exec basename {} \; | sort
# 查找當前目錄.log文件,并找出包含“error”的行
find ./ -type f -name "*.log" | xargs grep -r "error"
# 查找文件移動到指定目錄
find . -name "*.log" -exec mv {} .. \; # 移動find的文件到上一層目錄
# 如果希望在test目錄下查找文件,但不希望在test/test3目錄下查找
find test -path "test/test3" -prune -o -print
# 避開多個文件夾:在test里面查找并且忽略test4和test3目錄
find test \( -path test/test4 -o -path test/test3 \) -prune -o -print
# 圓括號表示表達式的結合。 \ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命令去解釋其意義。
# 查找某一確定文件,-name等選項加在-o 之后
find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print
# -o 是或者的意思,-a 是而且的意思,-not 是相反的意思
# 在$HOME目錄中查找文件屬主為zhouzhou的文件
find ~ -user zhouzhou -print
```
### xargs
在使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之后,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。
xargs 又稱管道命令,構造參數等。是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具 它把一個數據流分割為一些足夠小的塊,以方便過濾器和命令進行處理 。簡單的說就是把其他命令的給它的數據傳遞給它后面的命令作為參數
find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,并如此繼續下去。
在有些系統中,使用-exec選項會為處理每一個匹配到的文件而發起一個相應的進程,并非將匹配到的文件全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
#### 主要參數
-i 用 {} 代替 傳遞的數據
-I string 用string來代替傳遞的數據-n[數字] 設置每次傳遞幾行數據
-n 選項限制單個命令行的參數個數
-t 顯示執行詳情
-p 交互模式
-P n 允許的最大線程數量為n
-s[大小] 設置傳遞參數的最大字節數(小于131072字節)
-x 大于 -s 設置的最大長度結束 xargs命令執行
#### xargs實例
```
# 將當前目錄下php文件,改名字
[root@localhost ~]# ls | grep .php | xargs -i mv {} {}.bak
```
#### find結合xargs實例
```
# 查找系統中的每一個普通文件,然后使用xargs命令來測試它們分別屬于哪類文件
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 11-12 19:32 test3
drwxrwxrwx 2 root root 4096 11-12 19:32 test4
[root@localhost test]# find . -type f -print | xargs file
./log2014.log: empty
./log2013.log: empty
./log2012.log: ASCII text
#刪除當前文件夾下的,tmp文件
find ./ -name "*.tmp" | xargs -i rm -rf {}
#刪除該目錄的所有普通文件
find ./ -type f -print0 |xargs -0 rm
# 在整個系統中查找內存信息轉儲文件(core dump) ,然后把結果保存到/tmp/core.log 文件中
find / -name "core" -print | xargs echo "" >/tmp/core.log
# 在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,并收回相應的寫權限
find . -perm -7 -print | xargs chmod o-w
# 用grep命令在所有的普通文件中搜索hostname這個詞
find . -type f -print | xargs grep "hostname"
# 用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞
find . -name \* -type f -print | xargs grep "hostnames" # 注意:\用來取消find命令中的*在shell中的特殊含義
# 使用xargs執行mv
find . -name "*.log" | xargs -i mv {} test4
# find后執行xargs提示xargs: argument line too long解決方法
find . -type f -atime +0 -print0 | xargs -l1 -t rm -f # -l1是一次處理一個;-t是處理之前打印出命令
# 使用-i參數默認的前面輸出用{}代替,-I參數可以指定其他代替字符,如例子中的[]
[root@localhost test]# ll
總計 12
[root@localhost test4]# find . -name "file" | xargs -I [] cp [] ..
[root@localhost test4]# ll
總計 304
-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log
[root@localhost test4]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
-rw-r--r-- 1 root root 0 11-13 06:03 log2014.log
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-13 05:50 test3
drwxrwxr-x 2 root root 4096 11-13 05:50 test4
# xargs的-p參數的使用 ,執行安全模式,使得每一行都要確認之后才能進行下一步
[root@localhost home]# ll
total 60
-rw-r--r-- 1 root root 47919 Sep 5 14:14 log1.txt.bak.bak
-rw-r--r-- 1 root root 32 Sep 5 14:14 sort2.txt.bak.bak
-rw-r--r-- 1 root root 57 Sep 5 14:14 sort.txt.bak.bak
drwxr-xr-x 2 root root 6 Sep 5 14:15 test
drwxr-xr-x 3 root root 20 Aug 29 18:52 wwwroot
-rwxr--r-- 1 root root 14 Sep 5 14:14 yha.txt.bak.bak
[root@localhost home]# find . -name \*.bak | xargs -p -i mv {} ./test/
mv ./log1.txt.bak.bak ./test/ ?...y
mv ./sort2.txt.bak.bak ./test/ ?...y
mv ./sort.txt.bak.bak ./test/ ?...y
mv ./yha.txt.bak.bak ./test/ ?...y
```
## locate
locate命令其實是“find -name”的另一種寫法,但是要比后者快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含 有本地所有文件信息。Linux系統自動創建這個數據庫,并且每天自動更新一次,所以使用locate命令查不到最新變動過的文件。為了避免這種情況,可 以在使用locate之前,先使用updatedb命令,手動更新數據庫。注意,該命令需要安裝
```
yum -y install mlocate
updatedb # 注意在mac中是另外一種調用方式 /usr/libexec/locate.updatedb
```
### 常用范例
```
# 搜索etc目錄下所有以sh開頭的文件
locate /etc/sh
# 搜索用戶主目錄下,所有以m開頭的文件
locate ~/m
# 搜索用戶主目錄下,所有以m開頭的文件,并且忽略大小寫。
locate -i ~/m
```
## whereis
whereis命令只能用于程序名的搜索,而且只搜索二進制文件(-b,也就是說用來看某個命令在什么目錄)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。
### 命令參數
-b 定位可執行文件。
-m 定位幫助文件。
-s 定位源代碼文件。
-u 搜索默認路徑下除可執行文件、源代碼文件、幫助文件以外的其它文件。
-B 指定搜索可執行文件的路徑。
-M 指定搜索幫助文件的路徑。
-S 指定搜索源代碼文件的路徑。
### 常用范例
```
whereis -m svn # 查出說明文檔路徑
whereis -s svn # 找source源文件
whereis -b svn # 定位svn命令在什么目錄
```
## which
which命令的作用是,在PATH變量指定的路徑中,搜索某個系統命令的位置,并且返回第一個搜索結果。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。
### 常用范例
```
# 查找文件、顯示命令路徑
which pwd
# 用 which 去找出 which
[root@localhost home]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/alias
/usr/bin/which
# 有兩個 which ,其中一個是 alias 這就是所謂的『命令別名』,意思是輸入 which 會等於后面接的那串命令
```
## type
type命令其實不能算查找命令,它是用來區分某個命令到底是由shell自帶的,還是由shell外部的獨立二進制文件提供的。如果一個命令是外部命令,那么使用-p參數,會顯示該命令的路徑,相當于which命令。
### 參數
-a 顯示一個名字的所有可能
-t 判斷一個名字當前是否是alias、keyword、function、builtin、file
-p 查看一個外部命令的執行路徑
-P 查看內部命令路徑
返回
alias 別名
keyword 關鍵字,Shell保留字
function 函數,Shell函數
builtin 內建命令,Shell內建命令
file 文件,磁盤文件,外部命令
unfound 沒有找到
### 常用范例
```
[root@localhost home]# type cd
cd is a shell builtin # cd是shell的自帶命令(build-in)
[root@localhost home]# type locate
locate is /usr/bin/locate
[root@localhost home]# type -p locate
/usr/bin/locate
```
- Apache
- 【Apache運維基礎(1)】Apache的安裝與使用
- 【Apache運維基礎(2)】主配置文件說明
- 【Apache運維基礎(3)】虛擬主機配置說明
- 【Apache運維基礎(4)】Apache的Rewrite攻略(1)
- 【Apache運維基礎(5)】Apache的Rewrite攻略(2).htaccess文件
- 【Apache運維基礎(6)】Apache的日志管理與分析
- 工具篇
- supervisor進程管理器
- Haproxy安裝與配置
- Nginx
- 【nginx網站性能優化篇(1)】gzip壓縮與expire瀏覽器緩存
- 【nginx網站性能優化篇(2)】反向代理實現Apache與Nginx的動靜分離(LNMPA)
- 【nginx網站性能優化篇(3)】反向代理實現負載均衡
- 【nginx網站性能優化篇(4)】理解nginx的高并發原理及其配置調優
- 【nginx運維基礎(1)】Nginx的編譯安裝與使用
- 【nginx運維基礎(2)】Nginx的配置文件說明及虛擬主機配置示例
- 【nginx運維基礎(3)】Nginx的編譯PHP
- 【nginx運維基礎(4)】Nginx的日志管理(日志格式與定時分割日志)
- 【nginx運維基礎(5)】Nginx的location攻略
- 【nginx運維基礎(6)】Nginx的Rewrite語法詳解
- 【nginx運維基礎(7)】配置SSL支持https訪問
- 【nginx運維基礎(8)】配置支持http2協議
- 【nginx運維基礎(9)】了解PHP-FPM 與 Nginx 的通信機制
- 其它
- Apache與Nginx下php隱藏http頭部版本信息的實現方法
- CURL與PHP-CLI的應用【CLI篇】
- CURL與PHP-CLI的應用【Curl篇】
- Linux之SAMBA共享服務
- 【Linux常識篇(1)】所謂的正向代理與反向代理
- 【Linux常識篇(2)】理解inode
- 【Linux常識篇(3)】文件及文件夾的ctime atime mtime的含義詳解
- centOS使用手記
- 服務器日志分析
- 高頻命令
- df
- mv
- gzip
- cp
- tar
- touch
- cat
- uniq
- nl
- more
- rmdir
- less
- mkdir
- head
- rm
- tail
- 五大查詢命令
- vi&vim
- ls與目錄結構
- grep
- awk
- sed
- 其他高頻命令