如何使用“{}”重定向通过 find 的 -exec 选项运行的命令的输出?

pka*_*ing 29 linux redirection find

我正在尝试自动svnadmin dump执行备份脚本的命令,并且我想做这样的事情:

find /var/svn/* \( ! -name dir -prune \) -type d -exec svnadmin dump {} > {}.svn \;
Run Code Online (Sandbox Code Playgroud)

这似乎有效,因为它查看 中的每个 svn 存储库/var/svn,并svnadmin dump在其上运行。

但是,{}exec 命令中的第二个不会替换正在处理的目录的名称。它基本上只产生一个名为{}.svn.

我怀疑这是因为 shell 解释>为结束find命令,并尝试将 stdout 从该命令重定向到名为{}.svn.

有任何想法吗?

Den*_*son 38

您可以像这样进行重定向:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh -c 'svnadmin dump {} > {}.svn' \;
Run Code Online (Sandbox Code Playgroud)

并且将进行正确的替换。


One*_*One 5

不,但是您可以编写一个简单的 bash 脚本来执行此操作,然后从 find 中调用它。
示例(/tmp/dump.sh):

#!/bin/sh
svn admin dump "$1" > "$1".svn
Run Code Online (Sandbox Code Playgroud)

然后:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
Run Code Online (Sandbox Code Playgroud)