乾貨:find+exec的風騷用法

find 是咱們很經常使用的一個Linux命令,可是咱們通常查找出來的額並不只僅是看看而已,還會有進一步的操做,這個時候exec的做用就顯現出來了。安全

  exec解釋:bash

  -exec  參數後面跟的是 command 命令,它的終止是以「;」爲結束標誌的,因此這句命令後面的分號是不可缺乏的,考慮到各個系統中分號會有不一樣的意義,因此前面加反斜槓。  ui

  {} 花括號表明前面find查找出來的文件名。spa

  使用find時,只要把想要的操做寫在一個文件裏,就能夠用exec來配合find 查找,很方便的class

 

咱們直接經過如下幾個實例來說解find與exec聯合用法。test

 

實例1:使用find命令查找相關文件後,再使用ls命令將它們的詳細信息列出來效率

咱們如今想把當前目錄下全部的.o文件所有找出來,並用 ls -l 命令將它們列出來。實現這個需求的命令以下:搜索

find . -type f -exec ls -l {};grep

結果以下:command

[root@localhost test]# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log
-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log
-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log
-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log
-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log
-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log

 

 

實例2:在目錄中查找更改時間爲n天之前的文件,使用rm命令將它們刪除

咱們如今想把當前目錄下全部的文件所有找出來,並用rm命令將它們刪除。實現這個需求的命令以下:

find . -type f -mtime +14  -exec rm {} \;

執行完這個命令後,該目錄下全部的14天之前的文件都被刪除。

輸出:

[root@localhost test]# ll
總計 328
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 33 10-28 16:54 log2013.log
-rw-r--r-- 1 root root 127 10-28 16:51 log2014.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log
-rw-r--r-- 1 root root 25 10-28 17:02 log.log
-rw-r--r-- 1 root root 37 10-28 17:07 log.txt
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 10-28 14:47 test3
drwxrwxrwx 2 root root 4096 10-28 14:47 test4
[root@localhost test]# find . -type f -mtime +14 -exec rm {} \;
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.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

 

實例3:在目錄中查找更改時間在n日之前的文件並刪除它們,在刪除以前先給出提示

在實例2中,咱們匹配到文件後就馬上執行rm命令,這樣操做有些危險,由於若是一旦誤操做,有可能會引發災難性的後果。

exec的安全模式就是爲了不這個問題而產生。它會在匹配到某個文件後,在進行操做以前會先問一下你,通過你的確認它纔會進行相應操做。

一樣的實例2的需求,若是採用安全模式的話,命令是這樣的:

find . -name "*.log" -mtime +14 -ok rm {} \;

執行結果以下:

[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
lrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.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 . -name "*.log" -mtime +5 -ok rm {} \;
< rm ... ./log_link.log > ? y
< rm ... ./log2012.log > ? n
[root@localhost test]# ll
總計 312
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.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

 

實例4:-exec中使用grep命令

假如我如今有個很大型的項目(如Linux內核),我想在裏面搜索一個含有某關鍵字的文件。咱們可使用grep命令檢索全部的文件。這樣作確定是能夠的,但若是項目很大的話,這樣太耗時了,效率過低。

咱們能夠先用find命令找到因此相關文件,而後再用grep命令檢索那些文件便可。由於已經使用find過濾一遍了,因此這樣操做會節約不少時間,提升效率。

命令以下:

find /etc -name "passwd*" -exec grep  "root" {} \;

結果以下:

[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

 

實例5:查找文件移動到指定目錄

這個需求就比較簡單了。好比我如今想把全部的.o文件找出來,而後新他們mv到buil目錄。命令以下:

find . -name "*.log" -exec mv {} .. \;

結果:

[root@localhost test]# ll
總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxr-x 2 root root 4096 11-12 22:49 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4
[root@localhost test]# cd test3/
[root@localhost test3]# ll
總計 304
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log
-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log
[root@localhost test3]# find . -name "*.log" -exec mv {} .. \;
[root@localhost test3]# ll
總計 0[root@localhost test3]# cd ..
[root@localhost test]# ll
總計 316
-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log
-rw-r--r-- 1 root root 61 11-12 22:44 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
drwxrwxr-x 2 root root 4096 11-12 22:50 test3
drwxrwxr-x 2 root root 4096 11-12 19:32 test4

相關文章
相關標籤/搜索