今天繼續上一次find命令的內容,主要是find和 -exec 和xargs的結合和使用。
(9) find 命令可以藉助選項-exec與其他命令進行結合。- exec算得上是find最強大的特性之一。
比如我們要將某位使用者全部檔案的所有權更換為另一個使用者(比如root),那麼就可以用 -user找出root擁有的所有檔案,然後用-exec更改所有權。(注意你必須以root使用者的身份執行find命令才能進行所有權的更改)
例1:
# find . -type f -user root -exec chown slynux {} \;
在這個命令中,{ }是一個與-exec選項搭配使用的特殊字元串。對於每一個匹配的檔案,{ }會被替換成相應的檔案名稱。例如,find命令找到兩個檔案test1.txt和text.txt,其所有者均為slynux,那麼find就會執行:
chown slynux {} 它會被解析為 chown slynux test1.txt 和 chown slynux test2.txt。
例2:
將給定目錄中的所有C程式檔案拼接起來寫入單個檔案all_c_files.txt。我們可以用find找到所有C檔案,然後結合-exec 使用cat命令:
$ find . -type f -name "*.c" -exec cat {} \ > all_c_file.txt
-exec 之後可以接任何命令。 { }表示一個匹配。對於任何匹配的檔案名稱, { } 均會被改檔案名稱所替換。
例3:
用下列命令將10天前的.txt檔案複製到OLD目錄中:
$ find -type f - name "*.txt" -mtime -10 -exec cp {} OLD \;
-exec 能夠同printf結合來產生有用的輸出資訊。例如
$ find . -type f -name "*.txt" -exec printf "Text file: %s\n" {} \;
(10): 讓find跳過特定的目錄
在搜尋目錄並執行某些操作時,有時為了提高效能,需要跳出一些子目錄。將某些檔案或目錄從搜尋過程中排除在外的技巧被稱之為修建。其操作方法如下:
$ find . \( -name "*.git" prune\) -o \(-type f -print\)# 代替直接使用 \( -type f -print\), 而是選擇需要的過濾器
以上命令列印出不包括在.git目錄中的所有檔案的名稱(路徑)。