我正在使用xargs来修改文件。我希望该命令将创建的临时文件重命名为原始输入文件名。如何访问保存在{} of xargs中的字符串?
xargs - I {} COMMAND HERE {} > tmp && mv tmp {}我正在尝试修改命令:
awk '{gsub("1","0",$6)}1' file.fam | awk '{gsub("2","1",$6)}1'> tmp && mv tmp file.fam要对文件夹中扩展名为.fam的所有文件执行操作,请执行以下操作:
ls | grep ".fam" | xargs -I {} awk '{gsub("1","0",$6)}1' {} | awk '{gsub("2","1",$6)}1'> tmp && mv temp {}发布于 2021-10-09 00:09:54
如果可以避免的话,请不要使用xargs -I。
假设面向行的输入和GNU xargs:
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。
for f in *.fam; do
awk '{gsub("1","0",$6)}1' <"$f" \
| awk '{gsub("2","1",$6)}1' >"$f.out" \
&& mv -- "$f.out" "$f"
donehttps://stackoverflow.com/questions/69502750
复制相似问题