我想知道是否有一个单行批量处理一个文件夹中的一组文件,并将结果重定向到另一个文件夹。 我试过这样的事情:
find input_dir/ -name "PATTERN" | xargs -I {} sed 's:foo:bar:g' > output_dir/{}
例如,input_dir /有文件A,B,C,我希望的结果是在output_dir /中处理文件A,B,C,文件名相同。
我希望使用{}来替换文件名并构建输出文件路径,但这并不起作用。
任何人都知道如何解决这个问题?或者其他更好的方法呢? 谢谢!
答案 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