Shell

find -exec 中管道和重定向輸出的正確位置?

  • February 18, 2021

我正在使用控制台find中的-exec選項,在 FreeBSD 上(例如,find . -exec sha1 {} \;)。

  1. 如何正確放置(如果需要,轉義)重定向和其他可能在語法上適用於 exec 命令或 find 命令的執行控制符號,例如 > >> | 和 &,我可能希望符號在不同場合應用於 thefind或命令?exec
  2. 在同一主題上,如果我想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包含/jan2017and /feb2017,結果將是 and 的兩個文件/backups/jan2017_hashes.txt/backups/feb2017_hashes.txt其中jan2017_hashes.txt包含來自sha1for(比如說)所有 .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 本身的輸出上執行重定向會給你帶來什麼。

引用自:https://unix.stackexchange.com/questions/395872