find -exec 中管道和重定向輸出的正確位置?
我正在使用控制台
find
中的-exec
選項,在 FreeBSD 上(例如,find . -exec sha1 {} \;
)。
- 如何正確放置(如果需要,轉義)重定向和其他可能在語法上適用於 exec 命令或 find 命令的執行控制符號,例如 > >> | 和 &,我可能希望符號在不同場合應用於 the
find
或命令?exec
- 在同一主題上,如果我想
tee
在控制台上查看 -exec 命令的輸出(以查看進度)並附加到文件(供以後使用),語法是什麼?(我知道 shell 各不相同,但希望最常用的 shell,如 sh/csh 非常相似?)
更新:
在某種程度上,我想了解嵌套是否
find -exec
可以在沒有腳本的情況下完成,作為一個簡單的命令。這是提示問題的案例:
- 外部
find
:查找所有匹配 DIR_MATCH_TEXT 的子目錄DIR1
- 內部
find
:對於在外部循環中找到的每個匹配的子目錄(稱為 DIR2),執行命令find DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; >> DIR1/DIR2_hashes.txt
目的是為每個匹配的子目錄創建一組文件,其中包含對該子目錄的某些
find -exec
操作的輸出。我的意思是,如果
/backups
包含/jan2017
and/feb2017
,結果將是 and 的兩個文件/backups/jan2017_hashes.txt
,/backups/feb2017_hashes.txt
其中jan2017_hashes.txt
包含來自sha1
for(比如說)所有 .pdf 文件的輸出/backups/jan2017
,並feb2017_hashes.txt
包含來自sha1
.pdf 中的所有 .pdf 文件的輸出/backups/feb2017
。從到目前為止的回復中,我收集到外部
find
必須使用 shell 呼叫作為參數-exec
?
I/O 重定向和管道是shell 的功能(例如,bash)。查看
find
命令的原始碼(https://www.gnu.org/software/findutils/),該-exec
選項分叉並直接執行給定的命令,它不會通過任何外殼發送它。鑑於此,在沒有幫助的情況下,您不能在 to 的參數中包含管道和重定向find
。但是,您可以
find
呼叫一個 shell 並讓該 shell 依次呼叫您的命令。通過外殼程序執行相同的程序時,您可以訪問外殼程序公開的 I/O 重定向操作。例如,考慮:find . -type f -exec bash -c 'ls -l "$1" >> /tmp/result' find-sh {} \;
這將在(shell 在此上下文中將該文件稱為)
ls -l
找到的每個文件上執行,並將輸出重定向到. 請注意,我使用而不是. 在這裡,find 為每個文件呼叫一個 shell,因此會導致每個結果都覆蓋前一個結果——你最終會得到一個只包含最後一個命令的輸出的文件。find``$0``/tmp/result``>>``>``>
管道也可以工作,同樣需要注意“每個文件一個 exec”。
find . -type f -exec bash -c 'ls -l "$1" | grep something' find-sh {} \;
儘管如此,我還不清楚為什麼要在 的上下文中應用重定向
-exec
,或者在 find 本身的輸出上執行重定向會給你帶來什麼。