我在学习 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
您无法分割作为-I
AFAIK 的一部分传递的占位符的内容,您需要引入一个 shell 上下文来处理此处的各个参数,即
xargs -L1 sh -c 'renaming "$1" to "$2"' "$0"
该标志一次-L1
处理一个通过管道传输的多行输出,并运行其中的内容,并将整行作为参数传递给它。xargs
sh -c '..'
顺便说一句,您不需要单独的counter
变量来跟踪唯一的行号。 awk 已经更新了变量中的当前行号NR
,您可以将其用作
gawk '{ print $0 " " strftime("%y-%m-%d") "_" NR ".JPG" }'