首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何引用xargs中保存的对象/字符串的基名{}

如何引用xargs中保存的对象/字符串的基名{}
EN

Stack Overflow用户
提问于 2021-10-08 23:58:49
回答 1查看 29关注 0票数 0

我正在使用xargs来修改文件。我希望该命令将创建的临时文件重命名为原始输入文件名。如何访问保存在{} of xargs中的字符串?

代码语言:javascript
复制
xargs - I {} COMMAND HERE {} > tmp && mv tmp {}

我正在尝试修改命令:

代码语言:javascript
复制
awk '{gsub("1","0",$6)}1' file.fam | awk '{gsub("2","1",$6)}1'> tmp && mv tmp file.fam

要对文件夹中扩展名为.fam的所有文件执行操作,请执行以下操作:

代码语言:javascript
复制
ls | grep ".fam" | xargs -I {} awk '{gsub("1","0",$6)}1' {} | awk '{gsub("2","1",$6)}1'> tmp && mv temp {}
EN

回答 1

Stack Overflow用户

发布于 2021-10-09 00:09:54

如果可以避免的话,请不要使用xargs -I

假设面向行的输入和GNU xargs:

代码语言:javascript
复制
updateFile() {
  awk '{gsub("1","0",$6)}1' <"$1" \
  | awk '{gsub("2","1",$6)}1' >"$1.tmp.$$" \
  && mv -- "$1.tmp.$$" "$1"
}

find . -name '*.fam' -print \
  | xargs -d $'\n' bash -c "$(declare -f updateFile); "'
      for arg; do updateFile "$arg"; done
    ' _

另请参阅BashPitfalls #56,了解如何在没有-0的情况下使用xargs是不安全的。(-d $'\n'不如-0安全,但如果您不能重写其他管道组件以使用NUL分隔符,那么它是第二好的选择)。

也就是说,对于您的实际用例,您根本不需要xargs

代码语言:javascript
复制
for f in *.fam; do
  awk '{gsub("1","0",$6)}1' <"$f" \
  | awk '{gsub("2","1",$6)}1' >"$f.out" \
  && mv -- "$f.out" "$f"
done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69502750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档