如何从Bash变量存储的文件名中提取日期戳并批量复制文件
从Bash变量提取日期并批量复制文件的单行命令方案
以下几种单行命令可以实现你的需求,同时避免解析ls输出的潜在问题:
方法1:用Bash内置参数扩展(推荐,无需外部工具)
dateis="${filename##*__}"; dateis="${dateis%.csv}"; cp /opt/project/xxxx/*"$dateis"*.csv /opt/project/jdev/data/landing/landing_xxxx/
${filename##*__}:移除变量filename中最后一个__及其之前的所有内容,得到2023-05-28.csv${dateis%.csv}:移除dateis变量末尾的.csv后缀,最终得到日期戳2023-05-28- 复制命令中用双引号包裹
$dateis,避免文件名含空格、特殊字符时出现错误
方法2:用awk提取日期
dateis=$(echo "$filename" | awk -F'[_.]' '{print $(NF-1)}'); cp /opt/project/xxxx/*"$dateis"*.csv /opt/project/jdev/data/landing/landing_xxxx/
- 以
_和.作为分隔符,取倒数第二个字段(也就是日期部分)
方法3:用sed正则提取
dateis=$(echo "$filename" | sed -E 's/.*__(.*)\.csv/\1/'); cp /opt/project/xxxx/*"$dateis"*.csv /opt/project/jdev/data/landing/landing_xxxx/
- 用正则匹配
__之后、.csv之前的内容,提取出日期戳
关于你之前尝试的ls命令的问题
直接解析ls的输出作为cp的参数是不推荐的:如果文件名包含空格、换行或特殊字符,会导致命令执行出错。建议始终用通配符(比如*$dateis*.csv)直接匹配文件,这是Bash处理文件的最佳实践。
内容的提问来源于stack exchange,提问作者R.Merritt
相关产品推荐
相关产品推荐

