【问题标题】:Repeated input redirection to c++ executable in bash重复输入重定向到 bash 中的 c++ 可执行文件
【发布时间】:2012-07-05 20:32:44
【问题描述】:

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

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

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

-bash: {}: No such file or directory

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

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

【问题讨论】:

    标签: bash file-io io executable io-redirection


    【解决方案1】:

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

    find files/* -exec bash -c '/path/to/stagger < "$1"' -- {} \;
    

    【讨论】:

      【解决方案2】:
      1. &lt; 运算符在运行命令之前被 shell 解释为重定向。 shell 尝试将输入从名为{} 的文件重定向到find 的标准输入,如果该文件不存在,则会发生错误。

      2. -name 的参数未加引号并包含一个全局字符。 shell 应用路径名扩展并为 find 提供无意义的参数。

      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
      

      【讨论】:

      • +1 进行解释,但我很确定他想要的是我在回答中猜到的。递归相对路径files/中的所有文件和目录。
      • @jordanm 是的,听起来可能是这样。不确定打开一个目录进行阅读有什么用。
      【解决方案3】:

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

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

      【讨论】:

      • 由于某种原因,我在这个选项上遇到了一个非法选项错误。"find: 非法选项 -- n find: 非法选项 -- a find: 非法选项 -- m find: 非法选项 - -e"
      • -name 选项在此上下文中无效,因此我已将其删除。
      • 这不起作用,这只是将两个参数传递给./stagger 程序,即文字&lt; 和文件名。为了使文件重定向起作用,shell 必须这样做(如果程序本身不能这样做),并且 shell 必须在 find 命令运行之后而不是之前这样做。乔丹的回答正确地做到了这一点。
      • 也许这是 Cygwin 的一个特性,但这对我有用。稍后我会在 Linux 系统上试用看看。
      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 2011-10-04
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2020-03-22
      相关资源
      最近更新 更多