提取列的一部分以执行cp命令

时间:2019-12-05 08:22:03

标签: awk sed

我希望创建复制命令,以在不删除后缀日期的情况下将文件从一个目录复制到目录中。有多个文件。

例如文件LOAN.DAILY.20191204

要创建命令

cp LOAN.DAILY.20191204 ../LOAN.DAILY

我的尝试

ls -lrt | awk ' /DAILY/{ print "cp " , $9 , "../" , sub(/\.20191204$/,""); $9 }'

获取输出

cp  LOAN.DAILY.20191204 ../ 1

为什么这个1会出现

3 个答案:

答案 0 :(得分:1)

一种简单的方法:

shopt -s nullglob
for file in *.DAILY.* ; do cp "$file" ../"${file%.*}";  done

shopt -s nullglob:为了避免出现不必要的副本,以防全局匹配失败。

"${file%.*}":Shell的参数扩展,以从字符串末尾到与第一个匹配的.相反的方向剥离所有内容。

尽管我想有很多,但我想不出更好更好的方法。

答案 1 :(得分:0)

根据https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

  

如上所述,sub()的第三个参数必须是变量,字段或数组元素。某些版本的awk允许第三个参数成为不是左值的表达式。在这种情况下,sub()仍会搜索该模式并返回零或一,但是替换的结果(如果有的话)会被丢弃,因为没有放置它的地方。

这说明了为什么您在输出中得到1

如果要修改第九列的值,则需要在sub调用中指定它:

ls -lrt | awk ' /DAILY/{ orig=$9; sub(/\.20191204$/,"", $9); print "cp " , orig , "../", $9 }'

在此命令中,$9的原始值存储在变量orig中,然后使用sub删除日期后缀,最后使用cp命令使用新旧值来构建。

答案 2 :(得分:0)

这可能对您有用(GNU sed):

ls *DAILY* |  sed -E 's#^(.*)\..*#cp & \1#'

,一旦检查了输出,就可以使用此版本来制作副本。

ls *DAILY* |  sed -E 's#^(.*)\..*#cp & \1#e'

或使用GNU parallel的替代方法:

parallel --dry-run cp {} {.} ::: *DAILY*

再次,检查结果,如果一切正常,请使用:

parallel cp {} {.} ::: *DAILY*
相关问题