我在 FreeBSD 上使用控制台中的find
选项-exec
(例如,find . -exec sha1 {} \;
)。
如何正确放置(如果需要,转义)重定向和其他在语法上适用于 exec 命令或 find 命令的执行控制符号,例如 > >> |和 &,我可能希望符号在不同场合应用于
find
或命令?exec
在同一主题上,如果我想使用
tee
在控制台上查看 -exec 命令的输出(以观察进度)并将其附加到文件(以供以后使用),那么语法是什么?
(我知道 shell 各不相同,但希望最常用的 shell(例如 sh/csh)非常相似?)
更新:
在某种程度上,我想了解嵌套是否find -exec
可以在没有脚本的情况下作为一个简单的命令来完成。以下是引发该问题的用例:
- 外部
find
:查找所有与 DIR_MATCH_TEXT 匹配的子目录DIR1
- inside
find
:对于在外循环中找到的每个匹配的子目录(称为 DIR2),执行命令find DIR2 -name "FILE_MATCH_TEXT" -exec sha1 {} \; >> DIR1/DIR2_hashes.txt
目的是创建一组文件,每个文件对应一个匹配的子目录,其中包含find -exec
该子目录上某些操作的输出。
我的意思是,如果/backups
包含/jan2017
和/feb2017
,则结果将是/backups/jan2017_hashes.txt
和处的两个文件/backups/feb2017_hashes.txt
,其中包含(例如)中所有 .pdf 文件的jan2017_hashes.txt
输出,并包含中所有 .pdf 文件的输出。sha1
/backups/jan2017
feb2017_hashes.txt
sha1
/backups/feb2017
从到目前为止的回复来看,我认为外部find
必须使用 shell 调用作为-exec
? 的参数。
答案1
I/O 重定向和管道是 shell(例如 bash)的功能。查看find
命令的源代码(https://www.gnu.org/software/findutils/),该-exec
选项分叉并直接执行给定的命令,它不会通过任何 shell 发送它。鉴于此,如果没有帮助,您无法在 的参数中包含管道和重定向find
。
但是,您可以find
调用 shell,然后让该 shell 依次调用您的命令。通过 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
>>
>
>
管道也可以工作,但有同样的警告“每个文件一个执行程序”。
find . -type f -exec bash -c 'ls -l "$1" | grep something' find-sh {} \;
尽管如此,我并不清楚为什么要在 的上下文中应用重定向-exec
,或者对 find 本身的输出执行重定向会给您带来什么。