我正在尝试对 find 命令找到的所有文件运行 expand shell 命令。我试过 -exec 和 xargs 但都失败了。谁能解释我为什么?我正在使用 mac 进行记录。
find . -name "*.php" -exec expand -t 4 {} > {} \;
这只是创建一个包含所有输出的文件 {} 而不是覆盖每个找到的文件本身。
find . -name "*.php" -print0 | xargs -0 -I expand -t 4 {} > {}
这只是输出

4 {}
xargs: 4: No such file or directory

最佳答案

您的命令不起作用有两个原因。

  • 输出重定向由 shell 完成,而不是由 find 完成。这意味着 shell 会将 find 的输出重定向到文件 {} 中。
  • 重定向将立即发生。这意味着文件将在 expand 命令读取之前写入。所以不可能将命令的输出重定向到输入文件中。

  • 不幸的是 expand 不允许将其输出写入文件。所以你必须使用输出重定向。如果您使用 bash ,您可以定义一个 function 来执行 expand ,将输出重定向到一个临时文件并将临时文件移回原始文件。问题是 find 会运行一个新的 shell 来执行 expand 命令。

    但是有一个解决方案:
    expand_func () {
      expand -t 4 "$1" > "$1.tmp"
      mv "$1.tmp" "$1"
    }
    
    export -f expand_func
    
    find . -name \*.php -exec bash -c 'expand_func {}' \;
    

    您正在使用 expand_func 将函数 export -f 导出到子 shell。并且您不使用 expand 执行 find -exec 本身,而是执行一个新的 bash 来执行导出的 expand_func

    关于linux - 运行扩展查找结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6677441/

    10-13 02:12