我错过了一些微妙的东西。我尝试在命令下运行,但它没有用。你能帮忙吗?
ls | awk '{ split($1,a,".gz")} {cp " " $1 " " a[1]".gz"}'
虽然我正在尝试打印时显示复制命令。
ls | awk '{ split($1,a,".gz")} {print "cp" " " $1 " " a[1]".gz"}'
不确定问题出在哪里。任何指针都会有所帮助
答案 0 :(得分:5)
总结一些评论并指出第一个例子的错误:
ls | awk '{ split($1,a,".gz")} {cp " " $1 " " a[1]".gz"}'
^ unassigned variable
cp
默认为“”,不会被视为程序cp
。如果您在包含一个文件test.gz_monkey
的目录中执行以下操作,您将看到原因:
ls | awk '{split($1,a,".gz"); cmd=cp " " $1 " " a[1] ".gz"; print ">>" cmd "<<" }'
结果
>> test.gz_monkey test.gz<<
^ the space here is because cp was "" when cmd was assigned
请注意,您可以使用;
分隔语句,而不是使用两个操作块。 Awk支持在子shell中运行命令 - 其中一个是system
,另一个是getline
。通过以下更改,您的概念可以起作用:
ls | awk '{split($1,a,".gz"); cmd="cp "$1" "a[1]".gz"; system(cmd) }'
^ notice cp has moved inside a string
需要注意的另一件事 - ls
不是仅在当前目录中查找文件的好选择。相反,请尝试find
:
find . -type f -name "*.gz_*" | awk '{split($1,a,".gz"); cmd="cp "$1" "a[1]".gz"; system(cmd) }'
虽然我个人认为,以下内容更具可读性:
find . -type f -name "*.gz_*" | awk '{split($1,a,".gz"); system(sprintf( "cp %s %s.gz", $1, a[1])) }'
答案 1 :(得分:4)
你为什么要使用awk
?尝试:
for f in *; do cp "$f" "${f%.gz*}.gz"; done