【问题标题】:Bash find replace multiple files to NEW filesBash find 将多个文件替换为新文件
【发布时间】:2020-07-07 22:21:42
【问题描述】:

我有一个目录,我们称它们为模板文件。 它们有一个需要替换的值。 我想要一个原始文件夹,每个文件的替换位置都有一个“关键字”。 我想替换这个词并将所有文件输出到一个新文件夹,其中的文件名称与输入相同。 我在这里找到的命令是:

find . -name '*.sql' -i -exec sed -e 's/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g' {} \;

如何让这个命令将文件输出到另一个目录并保持原件不变? 非常感谢你的帮助! 我希望原始文件保持不变。该文件夹称为 Templates,与 Templates 目录位于同一目录中的文件夹称为 Usefiles。模板文件充当基础文件,因此不应更改。我想我可以使用上面的建议,但是执行 2 个单独的 find 命令,一个用于复制,另一个用于 sed 在新目录中 更新>>>> 我一直在尝试这些建议,但 sed 似乎不起作用。副本有效,但 sed 是一个变量,在脚本中显示为空白。 这是我的电流,再次感谢!! :

#!/bin/bash

echo "Enter Year i.e. 2020"
read -p reportyear
echo "Enter Month i.e. 04"
read -p reportmonth
SUBSTITUTIONTEXT=$reportyear/$reportmonth

find MOT/ -name '*.sql' -exec sh -c 'for f; do
 echo cp -v "$f" MOU/ && echo sed -ie "s/TEXTTOSUBSTITUTE/$SUBSTITUTIONTEXT/g" MOU/"${f##*/}"
done' _ {} +

最终更新 感谢你们,一个可行的解决方案:

echo "Enter Year i.e. 2020"
read reportyear
echo "Enter Month i.e. 04"
read reportmonth
SUBSTITUTIONTEXT=$reportyear\/$reportmonth
cd /to/relevant/files
find MOT/ -name '*.sql' -exec sh -c 'for f; do 
cp -v "$f" MOU/ && sed -i 's@SUBSTITUTIONYEARMONTH@"$SUBSTITUTIONTEXT"@' MOU/"${f##*/}" 
done' _ {} + > /dev/null 2>&1

【问题讨论】:

  • 另一个目录是否与 .sql 文件位于同一文件夹中?而且这里真的需要find吗,子目录下有没有.sql文件?
  • 我的回答目前原始文件被复制到目的地不变并编辑当前目录中的文件。我就是这么理解你的问题的。
  • 或者我得到了相反的逻辑...... :-(
  • 对 sed 使用不同的分隔符,例如"s,TEXTTOSUBSTITUTE,$SUBSTITUTIONTEXT,g" 基本上分隔符不能在字符串/正则表达式中,因此您可以选择任何字符串,例如管道 | 或我向您展示的逗号 ,

标签: bash ubuntu sed find


【解决方案1】:

这可能对你有用(GNU sed 和并行):

sub=2020/04
find Templates -name '*.sql'| parallel "sed 's#key#'"$sub"'#g' {} > Usefiles/{/}"

sub中设置替代参数。

将 find 命令传递给并行调用。

从 find 命令对每个文件运行 sed,并用 $sub 替换每个 key,将输出放在与 Templates 相同的目录中的目录 Usefiles 中,并具有相同的文件名。

【讨论】:

    【解决方案2】:

    如问题所述,两个目录TemplatesourceUsedfilesdestination

    使用find(1)

    find Templates/ -name '*.sql' -exec sh -c 'for f; do
     echo cp -v "$f" Usefiles/ && echo sed -ie "s/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g" Usefiles/"${f##*/}"
    done' _ {} +
    

    另一种选择是使用来自bash 的shellopt globstar

    #!/usr/bin/env bash
    
    shopt -s globstar
    
    for f in ./Templates/**/*.sql; do
     echo cp -v "$f" Usefiles/ && echo sed -ie 's/TEXTTOSUBSTITUTE/SUBSTITUTIONTEXT/g' Usefiles/"${f##*/}"
    done
    

    【讨论】:

    • 对,需要OP澄清一下,
    • 我希望原始文件保持不变。该文件夹称为 Templates,与 Templates 目录位于同一目录中的文件夹称为 Usefiles。模板文件充当基础文件,因此不应更改。我想我可以使用上面的建议,但是执行 2 个单独的 find 命令,一个用于复制,另一个用于在新目录中 sed。
    • 能否请您更新问题并添加您在此处发布的内容。
    猜你喜欢
    • 2021-10-21
    • 2012-09-04
    • 1970-01-01
    • 2018-07-23
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2012-08-25
    相关资源
    最近更新 更多