find -exec command {} + 的命令列是如何建構的

find -exec command {} + 的命令列是如何建構的

我發現手冊的解釋有點find不清楚。

「但是命令列是透過在末尾附加每個選定的檔案來建構的;命令的呼叫總數將遠小於匹配的檔案數」是什麼意思,這是為什麼?

下面是正文man find

-執行指令{} +

-exec操作的變體對選定的檔案執行指定的命令,但命令列是透過在末尾附加每個選定的檔案名稱來建構的;該命令的調用總數將遠小於匹配的檔案數。命令列的建構方式與xargs建構其命令列的方式大致相同。命令中只允許出現一個「{}」實例。該指令在起始目錄中執行。

答案1

「但是命令列是透過在末尾附加每個選定的檔案來建構的;命令的呼叫總數將遠小於匹配的檔案數」是什麼意思,這是為什麼?

讓我們建立一些範例文件:

touch {1..5}.txt

首先,讓我們執行一個查找命令:

$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt

如您所見,{}已替換為找到的所有文件的清單find。在此範例中,我們有六個匹配的文件,但echo僅運行一次。

請注意,shell 對單一命令列上接受的字元數有限制。 find知道這一點,如果有太多檔案無法放在一個命令列上,find則會echo使用不同的檔案運行多次,直到處理完所有檔案名稱。這就是為什麼「命令的呼叫次數會比匹配的檔案數少得多」。

讓我們透過在目錄中建立許多文件來測試這一點:

touch this_is_a_long_file_name{1..10000}.txt

現在,讓我們執行一個查找命令:

$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line

正如您所看到的,儘管目錄有超過 10,000 個文件,但 exec 命令只運行了 3 次。

相關內容