我希望创建复制命令,以在不删除后缀日期的情况下将文件从一个目录复制到目录中。有多个文件。
例如文件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会出现
答案 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*