如何批量sed文件和重定向结果

时间:2016-09-14 03:15:24

标签: linux bash sed xargs

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

我的技巧是编写一个执行该作业的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 {} +),但它通常比写一个相对简单的脚本并使用它并扔掉它更难。例如,当您运行显式脚本时,而不是尝试在命令行上编写脚本时,引用问题往往会更少。如果您发现自己正在使用单引号,双引号和反斜杠(或反引号),那么现在是时候使用一个简单的脚本了。

答案 1 :(得分:1)

使用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/{/}

答案 2 :(得分:1)

分两步:

$scope.add = function() {
    $scope.phonelist.push($scope.phone);
}

$scope.removeSelected = function() {
    var i = $scope.phonelist.length;
    // reversed loop because you change the array
    while (i--) {
        var phone = $scope.phonelist[i];
        // If phone is checked, remove from list
        if(phone.checked) {
            $scope.phonelist.splice(i, 1);
        }
    }
}

大于

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

或者,如果sed 's:foo:bar:g' -i output_dir/* 可能包含与“PATTERN”不匹配的文件:

output_dir