我缺少一些细微之处。我尝试在命令下运行,但是没有用。你能帮忙吗?
ls | awk '{ split($1,a,".gz")} {cp " " $1 " " a[1]".gz"}'
Run Code Online (Sandbox Code Playgroud)
虽然当我尝试打印时显示复制命令。
ls | awk '{ split($1,a,".gz")} {print "cp" " " $1 " " a[1]".gz"}'
Run Code Online (Sandbox Code Playgroud)
不知道问题出在哪里。任何指针都会有所帮助
总结一些评论并指出第一个示例出了什么问题:
ls | awk '{ split($1,a,".gz")} {cp " " $1 " " a[1]".gz"}'
^ unassigned variable
Run Code Online (Sandbox Code Playgroud)
该cp
默认为“”,不视为程序cp
。如果您在具有一个文件的目录中执行以下操作,test.gz_monkey
则会看到原因:
ls | awk '{split($1,a,".gz"); cmd=cp " " $1 " " a[1] ".gz"; print ">>" cmd "<<" }'
Run Code Online (Sandbox Code Playgroud)
结果是
>> test.gz_monkey test.gz<<
^ the space here is because cp was "" when cmd was assigned
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用;
而不是两个操作块来分隔语句。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
Run Code Online (Sandbox Code Playgroud)
注意的另一件事- ls
不是仅在当前目录中查找文件的好选择。相反,请尝试find
:
find . -type f -name "*.gz_*" | awk '{split($1,a,".gz"); cmd="cp "$1" "a[1]".gz"; system(cmd) }'
Run Code Online (Sandbox Code Playgroud)
就个人而言,我认为以下内容更易读:
find . -type f -name "*.gz_*" | awk '{split($1,a,".gz"); system(sprintf( "cp %s %s.gz", $1, a[1])) }'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5105 次 |
最近记录: |