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

評(píng)論