【问题标题】:how to batch sed files and redirect results如何批处理 sed 文件并重定向结果
【发布时间】:2016-09-23 19:16:51
【问题描述】:

我想知道是否有一个用于批处理一个文件夹中的一组文件并将结果重定向到另一个文件夹的单行程序。 我尝试过这样的事情:

find input_dir/ -name "PATTERN" | xargs -I {} sed 's:foo:bar:g' > output_dir/{}

例如,input_dir/ 有文件 A、B、C,我希望的结果是在 output_dir/ 中处理了文件 A、B、C,文件名相同。

我希望使用 {} 来替换文件名并构建输出文件路径,但这不起作用。

有人知道如何解决这个问题吗?或者其他更好的方法? 谢谢!

【问题讨论】:

  • 您的意思是您想要将更改的文件名列表输出到文件吗? “重定向结果”不清楚。
  • OP 已更新.. 基本上我想要一个文件列表在 output_dir/ 中具有相同的文件名,但它们由 'sed' 处理
  • 但只是一个列表,而不是实际文件,对吗?
  • 不太确定您的问题...输入 = n 个文件,输出 = n 个文件,一对一映射。
  • Shell 会逐渐减少对find 的需求;如果不需要,请不要使用它。由于bash 4.0,你可以写shopt -s globstar; for f in input_dir/**/PATTERN; do sed 's:foo:bar:g' "$f" > output_dir/"${f#input_dir/}"; done

标签: linux bash sed xargs


【解决方案1】:

我的技术是编写一个完成这项工作的 shell 脚本,然后通过find 运行它。例如,您的操作可以写入脚本munger.sh

#!/bin/sh
for file in "$@"
do
    output="output_dir/$(basename "$file")"
    sed -e 's:foo:bar:g' "$file" > "$output"
done

find 命令变为:

find input_dir -name "PATTERN" -exec sh munger.sh {} +

这会以文件名作为参数运行脚本,将大量文件名方便地捆绑到 shell 脚本的单个调用中。如果您不再需要它,只需在完成后删除 munger.sh

是的,你可以做各种扭曲来以你想要的方式执行命令(也许使用find … -exec bash -c "the script to be executed" arg0 {} +),但它通常比编写一个相对简单的脚本并使用它并扔掉它更难。引用的问题往往更少,例如,当您运行显式脚本时,比尝试在命令行上编写脚本时。如果您发现自己在使用单引号、双引号和反斜杠(或反引号),那么是时候使用如图所示的简单脚本了。

【讨论】:

  • 谢谢!也许这是一种更好的策略——有时单行命令可能很复杂且容易出错。
【解决方案2】:

使用 GNU Parallel 它看起来像这样:

find input_dir/ -name "PATTERN" | parallel sed s:foo:bar:g {} '>' output_dir/{/}

如果sed 命令有特殊字符,那么你需要引用那些双引号:

find input_dir/ -name "PATTERN" | parallel sed 's:foo.\*:bar:g' {} '>' output_dir/{/}

【讨论】:

    【解决方案3】:

    分两步:

    find input_dir/ -name "PATTERN" -exec cp -t output_dir/ {} +
    

    sed 's:foo:bar:g' -i output_dir/*
    

    或者,如果output_dir 可能包含与“PATTERN”不匹配的文件:

    find output_dir -name "PATTERN" -exec sed -e 's:foo:bar:g' -i {} +
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2013-09-08
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多