Linux find命令是根據指定條件搜索文件和目錄的絕佳工具。exec允許您對找到的文件執行指定操作。
例如你要使用find命令找到所有以.jpeg作為擴展名的文件,然后用.jpg擴展名重命名文件。
此時你兩種方法可以對find
命令的結果執行指定的操作。第一種是使用xargs
命令,第二種是exec
命令。
我們已經編寫過有一篇xargs命令詳解的文章。本教程將重點詳解組合find exec命令的用法。
您不能只是通過管道將find命令輸出重定向到另一個命令。它不會那么簡單
在開始本教程之前,請運行touch命令touch file1.txt file2.txt file3.txt
創建教程需要使用的文件。
touch file1.txt file2.txt file3.txt
find exec 命令實例教程
find
命令和exec
命令組合使用的基本語法是find [path] [arguments] -exec [command] {} \\;
。
[command]
是您要對find
命令的結果執行的操作。{}
是一個占位符,用于保存find
命令的搜索結果。
\\;
表示[command]
命令的結束。在這里你需要轉義;
避免shell的解釋,因此會寫成這樣\\;
。
還有另一種語法與上述略有不同,這是它的語法形式find [path] [arguments] -exec [command] {} +
。
+
表示對于find
命令搜索結果,運行一次[command]
。所有結果都作為參數一起傳遞給[command]
。
你仍然對{} \\;
和{} +
的使用感到困惑,你可以嘗試跟著我們的實例進行操作。
find . -type f -exec ls {} ;
命令將會對搜索每一個搜索結果運行ls
命令,類似于運行3次ls
命令,但每次參數都是不同的文件。
find . -type f -exec ls {} \\;
#eq
ls file1.txt
ls file2.txt
ls file3.txt
如果你使用的是{} +
。也就是將find命令的搜索結果一次傳遞給exec指定的命令[command]
。例如命令find . -type f -exec ls {} ;
。
與{} \\;
運行多次同一個命令相比,使用{} +
是更好的選擇,因為性能更好。但在某些情況你不能這樣做。
如果find
命令搜索結果有50個,則不能將搜索結果作為參數一次傳遞給命令,因為Linux對最大命令行長度有限制。
find . -type f -exec ls {} ;
#eq
ls file1.txt file2.txt file3.txt
find exec 命令搜索重命名文件擴展
使用find exec命令可讓你以輕松重命名文件。在組合使用find exec命令還需要使用mv。mv 命令是用于移動文件或者重命名文件。
以下命令將會修改當前目錄的所有*.txt
文件擴展名為.js
。-exec
運行sh
命令啟動子shell進程。
sh -c 'mv "$1" "${1%.txt}.edefg"'
子shell進程運行命令mv "$1" "${1%.txt}.js"
。${1%.txt}.js
參數將會匹配原始文件擴展名的txt
并替換為js
。
find . -type f -name '*.txt' -exec sh -c 'mv "$1" "${1%.txt}.js"' _ {} \\;
find exec 命令刪除文件
自動刪除文件時請格外小心。如果不注意,可能會是災難性的。要么使用交互式刪除命令rm -i
,要么先打印查看find
命令搜索的結果。
find exec命令組合的另一個常見示例是搜索大于指定大小的文件并將其刪除。如果您正在清理日志,這很有效。
例如刪除大于100 MB的文件,或者根據文件的修改時間刪除文件。在這里,我們使用-mtime
選項搜索過去10小時修改的文件并刪除。
find ~/Desktop -size +100M -exec rm {} \\;
sudo find /tmp/ -type f -mtime +10 -exec rm {} \\;
Find exec grep 命令搜索文件內容
find
命令僅對文件屬性進行搜索。而grep
命令可用于文件的內容。將Find exec和grep組合起來,您就得到一個強大的命令行搜索工具。
例如命令find . -type f -name "*.js" -exec grep -H keyword {} ;
搜索當前目錄的所有js
文件,然后使用grep命令搜索關鍵詞keyword
。
這里之所以使用grep
命令的-H
選項,是因為grep默認不打印匹配搜索模式的文件名。-H
選項將會打印匹配的文件名和匹配的內容并使用:
分隔。
find . -type f -name "*.js" -exec grep -iH a {} \\;
Find 命令與多個exec
是的,您可以將Find命令的搜索結果鏈接多個exec命令。多個exec命令并不是共享find命令的搜索結果。
而是第一個exec命令的結果再傳遞下一個exec命令。例如以下命令它將首先搜索.hbs文件。然后第一個exec命令的標準輸出傳遞到第二個exec命令。
Find是很強大的命令,用于根據多個條件搜索文件。exec命令使您能夠處理find命令的結果。
find . -type f -name "*js" -exec ls {} \\; -exec grep -H keyword {} \\;
find exec 命令修改文件目錄權限所有權
修改文件和目錄的所有權是組合Find exec命令另一個例子。以下命令,搜索myfreax
用戶擁有的文件,然后將其所有權更改為myfreax.com
。
如果你學會更改文件的所有權,自然你很容易就會使用find exec命令修改文件目錄權限,-type f
是文件,-type d
是目錄。
在這里分享的例子只是簡單的示例。find exec命令組合一起為您提供了在Linux命令行中執行操作的無限可能。
sudo find /home/myfreax/disk/Downloads -user myfreax -type f -exec chown myfreax.com {} \\;
sudo find /home/myfreax/disk/Downloads -type f -exec chmod 644 {} \\;
-
Linux
+關注
關注
87文章
11345瀏覽量
210389 -
Find
+關注
關注
0文章
54瀏覽量
11667 -
命令
+關注
關注
5文章
696瀏覽量
22108
發布評論請先 登錄
相關推薦
評論