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
拜托,我需要帮助重命名多个文件。我们使用文件掩码 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