Bash 使用正则表达式复制带有时间戳的最新文件

Bash multiple copy latest files with timestamp using regex

拜托,我需要帮助重命名多个文件。我们使用文件掩码 OPEN_REPORTn_yyyymmddHH24Miss.csv 每天生成 3 份报告中的一个应用程序,例如这样的列表:

/mnt/server/OPEN_REPORT1_20180604130922.csv
/mnt/server/OPEN_REPORT2_20180604130922.csv
/mnt/server/OPEN_REPORT3_20180604130922.csv

我想将此文件复制为

/mnt/server/OPEN_REPORT1.csv
/mnt/server/OPEN_REPORT2.csv
/mnt/server/OPEN_REPORT3.csv

并保留原始文件而不更改名称(因此,这意味着我必须只列出最后 3 个文件)

我有这个解决方案:

cp $(ls -t /mnt/server/OPEN_REPORT1_* | head -n1) /mnt/server/OPEN_REPORT1.csv
cp $(ls -t /mnt/server/OPEN_REPORT2_* | head -n1) /mnt/server/OPEN_REPORT2.csv
cp $(ls -t /mnt/server/OPEN_REPORT3_* | head -n1) /mnt/server/OPEN_REPORT3.csv

但是这个解决方案不太有效,因为我根据需要使用了更多 cp 命令。我只想用一个 use cp 命令和正则表达式复制这些文件。

我正在尝试这样的解决方案:

for file in $(ls -t /mnt/server/OPEN_REPORT?_??????????????.csv | head -n3); do echo ${file} | sed 's/OPEN_REPORT([0-9]{1})//'; done

但是 echo 的结果看起来不太好。

请帮忙解决一下?感谢您的任何建议

解决方案(感谢David Peltier):

for file in $(ls -t /mnt/server/OPEN_REPORT?_??????????????.csv | head -n3); do cp $file ${file%_*}.csv; done

试试这个

for file in $(ls -1 /mnt/server/*.csv); do cp /mnt/server/$file /mnt/server/${file%_*}.csv;done

Bash可以替换,不用sed了

${var%Pattern}, ${var%%Pattern}

${var%Pattern} Remove from $var the shortest part of $Pattern that matches the back end of $var.

${var%%Pattern} Remove from $var the longest part of $Pattern that matches the back end of $var. 

https://www.tldp.org/LDP/abs/html/parameter-substitution.html