在 xargs 命令中使用两列文件作为变量

在 xargs 命令中使用两列文件作为变量

我在学习 awk / xargs 时尝试重命名一些文件。我管理了一个命令,该命令为我提供了一个包含两列的文件,第一列是我要重命名的文件的名称,第二列是该文件最终应使用的名称。
如何分割文件的内容(最好使用 awk / xargs 等程序),以便我可以使用每一列作为变量

命令

echo "foto1.JPG
foto2.JPG
foto3.JPG" | \
gawk '{ count++ }{ print $0 " " strftime("%y-%m-%d") "_" count ".JPG" }'  

输出

foto1.JPG 21-11-09_1.JPG                                                
foto2.JPG 21-11-09_2.JPG
foto3.JPG 21-11-09_3.JPG

这就是我想要的,但我不知道如何分离和使用它的结果。我试过

echo "foto1.JPG
foto2.JPG
foto3.JPG" | \                                                          
gawk '{ count++ }{ print $0 " " strftime("%y-%m-%d") "_" count ".JPG" }' | \
xargs -I% echo renaming $(echo % | awk '{ print $1 }') to $(echo % | awk '{ print $2 }') "..."

但它输出

renaming foto1.JPG 21-11-09_1.JPG to ...                                                      
renaming foto2.JPG 21-11-09_2.JPG to ...
renaming foto3.JPG 21-11-09_3.JPG to ...

这与我冲突,因为

echo renaming $(echo foo bar | awk '{ print $1 }') to $(echo foo bar | awk '{ print $2 }') "..."

给我

renaming foo to bar ...

echo "foto1.JPG
foto2.JPG
foto3.JPG" | \
gawk '{ count++ }{ print $0 " " strftime("%y-%m-%d") "_" count ".JPG" }' | \
xargs -I% echo this line has % in it

输出

this line has foto1.JPG 21-11-09_1.JPG in it
this line has foto2.JPG 21-11-09_2.JPG in it
this line has foto3.JPG 21-11-09_3.JPG in it

%我猜使用声明内部有问题$( ... )

答案1

您无法分割作为-IAFAIK 的一部分传递的占位符的内容,您需要引入一个 shell 上下文来处理此处的各个参数,即

xargs -L1 sh -c 'renaming "$1" to "$2"' "$0"

该标志一次-L1处理一个通过管道传输的多行输出,并运行其中的内容,并将整行作为参数传递给它。xargssh -c '..'


顺便说一句,您不需要单独的counter变量来跟踪唯一的行号。 awk 已经更新了变量中的当前行号NR,您可以将其用作

gawk '{ print $0 " " strftime("%y-%m-%d") "_" NR ".JPG" }'

相关内容