1

我用 c++ 编写了一个可执行文件,它旨在从文件中获取输入,并输出到标准输出(我想将其重定向到单个文件)。问题是,我想在文件夹中的所有文件上运行它,而我使用的 find 命令不合作。我正在使用的命令是:

find -name files/* -exec ./stagger < {} \;

通过查看示例,我的理解是 {} 替换了文件名。但是,我收到错误:

-bash: {}: No such file or directory

我假设一旦解决了这个问题,为了将所有结果放入一个文件中,我可以简单地使用模式命令 >> outputfile.txt。

感谢您的帮助,如果问题可以澄清,请告诉我。

4

3 回答 3

4

您遇到的问题是在 find 命令之前处理了重定向。您可以通过在 -exec 调用中生成另一个 bash 进程来解决此问题:

find files/* -exec bash -c '/path/to/stagger < "$1"' -- {} \;
于 2012-07-05T20:42:11.927 回答
2
  1. <运行命令之前,操作符被 shell 解释为重定向。shell 尝试将输入从名为 's stdin 的文件重定向{}find如果该文件不存在,则会发生错误。

  2. to 的参数-name未加引号并包含一个全局字符。shell 应用路径名扩展并给出无意义的参数来查找。

  3. 文件名不能包含斜杠。的论点-name即使被引用也不起作用。如果 GNU find 可用,-path可用于指定 glob 模式files/*,但这并不意味着“名为 files 的目录中的文件”,因为您需要-regex. 便携式解决方案更难。

  4. 您需要指定一个或多个find开始路径。

假设您真正想要的是让 shell 执行重定向,这是 GNU find 的一种方法。

find . -type f -regex '.*foo/[^/]*$' -exec sh -c 'for x; do ./stagger <"$x"; done' -- {} +

这可能是使用find-depth并且-prune不适用于此)的最佳便携方式:

find . -type d -name files -exec sh -c 'for x; do for y in "$x"/*; do [ -f "$y" ] && ./stagger <"$y"; done; done' -- {} +

如果您使用的是 Bash,那么这个问题非常适合仅使用globstar模式而不是find.

#!/usr/bin/env bash
shopt -s extglob globstar nullglob

for x in **/files/*; do
    [[ -f "$x" ]] && ./stagger <"$x"
done
于 2012-07-06T11:39:41.377 回答
0

只需转义小于符号,以便通过 find 命令而不是它正在运行的 shell 执行重定向:

find files/* -exec ./stagger \< {} \;
于 2012-07-05T20:45:32.657 回答