第六天 find xargs

目錄

find

xargs


find

find  path  -options  [ -print ]  [ -exec  -ok  command ]  {} \;

佔位符機制,這種機制中的佔位符是“{}”。

-name  按照文件名查找文件

-perm   按照文件權限查找文件
-prune  忽略目錄
-user    按照文件屬主查找
-group   按照文件所屬的組來查找文件
-mtime -n +n  按照文件的更改時間來查找文件,-n表示文件更改時間距現在n天以內,+n表示文件更改時間距現在n天以前
-nogroup    查找無有效屬組的文件、即該文件所屬的組在/etc/groups中不存在
-nouser    查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在
-newfile file1 ! file2  查找更改時間比文件file1新但比文件file2舊的文件
-type      查找某一類型的文件,諸如:
b       塊設備文件
d       目錄
c        字符設備文件
p        管道文件
l         符號鏈接文件
f         普通文件
-size  n[c]    查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計
-depth         在查找文件是,首先查找當前目錄只的文件,然後再在其子目錄中查找
-fstype        查找位於某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到
-mount       在查找文件時不跨越文件系統mount點
-follow        如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件
-cpio           對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。
在$HOME目錄下查找txt文件並打印
find ~ -name "*.txt" -print
在當前目錄下查找txt文件並打印
find . -name "*.txt" -print

查找系統中的每一個普通文件,並用xargs命令來測試它們分別屬於哪類文件:

[root@localhost script]# find /home -type f |xargs file
查找大於10M並列出詳細信息
#-size n[c]查找文檔長度爲n塊的文檔 有[c]表示文檔長度以字節計算
#-exec  command  {} \;   將查到的文檔執行command操作,{} 和 \;之間有空格
#-ok 和-exec相同,只是在操作前要詢用戶
[root@localhost script]# find ~ -size +10000000c |xargs ls -l
[root@localhost script]# find ~ -size +10000000c -exec ls -l {} \;
[root@localhost script]# find ~ -size +10000000c -ok ls -l {} \;
查找用戶mysql的文件
[root@localhost script]# find / -user mysql
查找包含if行的所有文件
[root@localhost script]# find . -type f |xargs grep "if"
查找以大寫字母開頭的文件
[root@localhost script]# find ~ -name "[A-Z]*"
在當前目錄下查找以f開始的文件,並把結果輸出到dddddd中
[root@localhost script]# find . -name "f*"  -fprint dddddd
查找以f或以c開頭的文件
[root@localhost script]# find . -name "f*" -o -name "c*"
find   /  -nouser             #查找在系統中屬於作廢用戶的文檔
find   /  -empty              # 查找在系統中爲空的文檔或文檔夾
find   /  -mmin   -5          # 查找在系統中最後5分鐘裏修改過的文檔
find   /  -mtime  -1          #查找在系統中最後24小時裏修改過的文檔

   下面給出find命令的主要應用示例:
   /> ls -l     #列出當前目錄下所包含的測試文件
   -rw-r--r--. 1 root root 48217 Nov 12 00:57 install.log
   -rw-r--r--. 1 root root      37 Nov 12 00:56 testfile.dat
   -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
   -rw-r--r--. 1 root root     183 Nov 11 08:02 users
   -rw-r--r--. 1 root root     279 Nov 11 08:45 users2
   1. 按文件名查找:
   -name:  查找時文件名大小寫敏感。
   -iname: 查找時文件名大小寫不敏感。
   #該命令爲find命令中最爲常用的命令,即從當前目錄中查找擴展名爲.log的文件。需要說明的是,缺省情況下,find會從指定的目錄搜索,並遞歸的搜索其子目錄。
   /> find . -name "*.log"
    ./install.log
   /> find . -iname U*          #如果執行find . -name U*將不會找到匹配的文件
   users users2
   2. 按文件時間屬性查找:
   -atime  -n[+n]: 找出文件訪問時間在n日之內[之外]的文件。
   -ctime  -n[+n]: 找出文件更改時間在n日之內[之外]的文件。
   -mtime -n[+n]: 找出修改數據時間在n日之內[之外]的文件。
   -amin   -n[+n]: 找出文件訪問時間在n分鐘之內[之外]的文件。
   -cmin   -n[+n]: 找出文件更改時間在n分鐘之內[之外]的文件。
   -mmin  -n[+n]: 找出修改數據時間在n分鐘之內[之外]的文件。
   /> find -ctime -2        #找出距此時2天之內創建的文件
   .
   ./users2
   ./install.log
   ./testfile.dat
   ./users
   ./test.tar.bz2
   /> find -ctime +2        #找出距此時2天之前創建的文件
   沒有找到                     #因爲當前目錄下所有文件都是2天之內創建的
   /> touch install.log     #手工更新install.log的最後訪問時間,以便下面的find命令可以找出該文件
   /> find . -cmin  -3       #找出修改狀態時間在3分鐘之內的文件。
   install.log

   3. 基於找到的文件執行指定的操作:
   -exec: 對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {} \;,注意{}和\;之間的空格,同時兩個{}之間沒有空格
   -ok:   其主要功能和語法格式與-exec完全相同,唯一的差別是在於該選項更加安全,因爲它會在每次執行shell命令之前均予以提示,只有在回答爲y的時候, 其後的shell命令纔會被繼續執行。需要說明的是,該選項不適用於自動化腳本,因爲該提供可能會掛起整個自動化流程。
   #找出距此時2天之內創建的文件,同時基於find的結果,應用-exec之後的命令,即ls -l,從而可以直接顯示出find找到文件的明顯列表。
   /> find . -ctime -2 -exec ls -l {} \;
   -rw-r--r--. 1 root root      279 Nov 11 08:45 ./users2
   -rw-r--r--. 1 root root  48217 Nov 12 00:57 ./install.log
   -rw-r--r--. 1 root root        37 Nov 12 00:56 ./testfile.dat
   -rw-r--r--. 1 root root      183 Nov 11 08:02 ./users
   -rw-r--r--. 1 root root  10530 Nov 11 23:08 ./test.tar.bz2
   #找到文件名爲*.log, 同時文件數據修改時間距此時爲1天之內的文件。如果找到就刪除他們。有的時候,這樣的寫法由於是在找到之後立刻刪除,因此存在一定誤刪除的危險。
   /> ls
   install.log  testfile.dat  test.tar.bz2  users  users2
   /> find . -name "*.log" -mtime -1 -exec rm -f {} \;
   /> ls
   testfile.dat  test.tar.bz2  users  users2
   在控制檯下,爲了使上面的命令更加安全,我們可以使用-ok替換-exec,見如下示例:
   />  find . -name "*.dat" -mtime -1 -ok rm -f {} \;
   < rm ... ./testfile.dat > ? y    #對於該提示,如果回答y,找到的*.dat文件將被刪除,這一點從下面的ls命令的結果可以看出。
   /> ls
   test.tar.bz2  users  users2

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

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

   6. 排除指定子目錄查找:
   -path pathname -prune:   避開指定子目錄pathname查找。
   -path expression -prune:  避開表達中指定的一組pathname查找。
   需要說明的是,如果同時使用-depth選項,那麼-prune將被find命令忽略。
   #爲後面的示例創建需要避開的和不需要避開的子目錄,並在這些子目錄內均創建符合查找規則的文件。
   /> mkdir DontSearchPath  
   /> cd DontSearchPath
   /> touch datafile1
   /> cd ..
   /> mkdir DoSearchPath
   /> cd DoSearchPath
   /> touch datafile2
   /> cd ..
   /> touch datafile3
   #當前目錄下,避開DontSearchPath子目錄,搜索所有文件名爲datafile*的文件。
   /> find . -path "./DontSearchPath" -prune -o -name "datafile*" -print
   ./DoSearchPath/datafile2
   ./datafile3
   #當前目錄下,同時避開DontSearchPath和DoSearchPath兩個子目錄,搜索所有文件名爲datafile*的文件。
   /> find . \( -path "./DontSearchPath" -o -path "./DoSearchPath" \) -prune -o -name "datafile*" -print
   ./datafile3

   7. 按文件權限屬性查找:
   -perm mode:   文件權限正好符合mode(mode爲文件權限的八進制表示)。
   -perm +mode: 文件權限部分符合mode。如命令參數爲644(-rw-r--r--),那麼只要文件權限屬性中有任何權限和644重疊,這樣的文件均可以被選出。
   -perm -mode:  文件權限完全符合mode。如命令參數爲644(-rw-r--r--),當644中指定的權限已經被當前文件完全擁有,同時該文件還擁有額外的權限屬性,這樣的文件可被選出。
   /> ls -l
   -rw-r--r--. 1 root            root           0 Nov 12 10:02 datafile3
   -rw-r--r--. 1 root            root    10530 Nov 11 23:08 test.tar.bz2
   -rw-r--r--. 1 stephen stephen        183 Nov 11 08:02 users
   -rw-r--r--. 1 root            root        279 Nov 11 08:45 users2
   /> find . -perm 644      #查找所有文件權限正好爲644(-rw-r--r--)的文件。
   ./users2
   ./datafile3
   ./users
   ./test.tar.bz2
   /> find . -perm 444      #當前目錄下沒有文件的權限屬於等於444(均爲644)。    
   /> find . -perm -444     #644所包含的權限完全覆蓋444所表示的權限。
   .
   ./users2
   ./datafile3
   ./users
   ./test.tar.bz2
   /> find . -perm +111    #查找所有可執行的文件,該命令沒有找到任何文件。
   /> chmod u+x users     #改變users文件的權限,添加owner的可執行權限,以便於下面的命令可以將其找出。
   /> find . -perm +111    
   .
   ./users    

   8. 按文件類型查找:
   -type:後面指定文件的類型。
   b - 塊設備文件。
   d - 目錄。
   c - 字符設備文件。
   p - 管道文件。
   l  - 符號鏈接文件。
   f  - 普通文件。
  /> find . ! -type d    #在當前目錄下,找出文件類型不爲目錄的文件。
   9. 按文件大小查找:
   -size [+/-]100[c/k/M/G]: 表示文件的長度爲等於[大於/小於]100塊[字節/k/M/G]的文件。
   -empty: 查找空文件。
   /> find . -size +4k -exec ls -l {} \;  #查找文件大小大於4k的文件,同時打印出找到文件的明細
   -rw-r--r--. 1 root root 10530 Nov 11 23:08 ./test.tar.bz2
   /> find . -size -4k -exec ls -l {} \;  #查找文件大小小於4k的文件。
   -rw-r--r--. 1 root            root 279 Nov 11 08:45 ./users2
   -rw-r--r--. 1 root             root    0 Nov 12 10:02 ./datafile3
   -rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users
   /> find . -size 183c -exec ls -l {} \; #查找文件大小等於183字節的文件。
   -rwxr--r--. 1 stephen stephen 183 Nov 11 08:02 ./users
   /> find . -empty  -type f -exec ls -l {} \;
   -rw-r--r--. 1 root root 0 Nov 12 10:02 ./datafile3

   10. 按更改時間比指定文件新或比文件舊的方式查找:
   -newer file1 ! file2: 查找文件的更改日期比file1新,但是比file2老的文件。
   /> ls -lrt   #以時間順序(從早到晚)列出當前目錄下所有文件的明細列表,以供後面的例子參考。
   -rwxr--r--. 1 stephen stephen   183 Nov 11 08:02 users1
   -rw-r--r--. 1 root           root    279 Nov 11 08:45 users2
   -rw-r--r--. 1 root           root 10530 Nov 11 23:08 test.tar.bz2
   -rw-r--r--. 1 root           root        0 Nov 12 10:02 datafile3
   /> find . -newer users1     #查找文件更改日期比users1新的文件,從上面結果可以看出,其餘文件均符合要求。
   ./users2
   ./datafile3
   ./test.tar.bz2
   /> find . ! -newer users2   #查找文件更改日期不比users1新的文件。
   ./users2
   ./users
   #查找文件更改日期比users2新,但是不比test.tar.bz2新的文件。
   /> find . -newer users2 ! -newer test.tar.bz2
   ./test.tar.bz2  


xargs

在使用find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給exec執行。不幸的是,有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。Find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。

在有些系統中,使用-exec選項會爲處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作爲參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高;而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。

1、多行變成單行
-bash-3.2# cat test.txt
a b c d e f
g o p q
-bash-3.2# cat test.txt |xargs
a b c d e f g o p q
2、單行變成多行
-bash-3.2# cat test.txt
a b c d e f g o p q
-bash-3.2# cat test.txt |xargs -n 2
a b
c d
e f
g o
p q
3、刪除某個重複的字符來做定界符
-bash-3.2# cat test.txt
aaaagttttgyyyygcccc
-bash-3.2# cat test.txt |xargs -d g
aaaa tttt yyyy cccc
4、刪除某個重複的字符來做定界符後,變成多行
-bash-3.2# cat test.txt |xargs -d g -n 2
aaaa tttt
yyyy cccc
5、用find找出文件以txt後綴,並使用xargs將這些文件刪除
-bash-3.2# find /root/ -name "*.txt" -print0 |xargs -0 rm -rf   #查找並刪除
-bash-3.2# find /root/ -name "*.txt" -print          #再次查找沒有
6、查找普通文件中包括thxy這個單詞的
-bash-3.2# find /root/ -type f -print |xargs grep "thxy"
/root/1.doc:thxy
7、查找權限爲644的文件,並使用xargs給所有加上x權限
-bash-3.2# find /root/ -perm 644 -print|xargs chmod a+x
-bash-3.2# find /root/ -perm 755 -print

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章