我發現手冊的解釋有點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 次。