重命名文件以删除日期戳

时间:2015-06-10 06:17:47

标签: bash shell

我在输入目录中有文件。文件名如下所示

  • SEMAPHOREINPUT_10-06-2015.xlsx
  • WRAPPERINPUT_10-06-2015.xlsx

这些文件将每天更新,明天,输入将是

  • SEMAPHOREINPUT_11-06-2015.xlsx
  • WRAPPERINPUT_11-06-2015.xlsx

我需要将这些文件重命名为以下文件名:

  • SEMAPHOREINPUT.xlsx
  • WRAPPERINPUT.xlsx

我尝试使用下面的shell脚本,但它无效。

#!/bin/bash

ls | while read FILES

do

        newfile =  ${FILES/\SEMAPHOREINPUT_.*.xlsx/}

        mv $newfile /home/test

done

2 个答案:

答案 0 :(得分:0)

三个严重错误:

  1. 为变量赋值时,=符号前后不得有空格。
  2. 您的字符串替换错误。要删除文件名的日期戳部分,请使用

    ${FILES/_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]/}
    

    ......或者更好,因为要删除的模式必须出现在字符串的末尾,

    ${FILES%_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].xlsx}.xlsx
    
  3. 您似乎混淆了初始和最终文件名。
  4. 还有其他问题:

    • 解析ls的输出比带有glob的循环更复杂,更不可靠:

      for file in *; do
          …
      done
      

      更好的是,明确避免意外:

      for file in SEMAPHOREINPUT_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].xlsx
                    WRAPPERINPUT_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].xlsx; do
          mv "$file" "/home/test/${file%_[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].xlsx}.xlsx"
      done
      

答案 1 :(得分:0)

你可以这样做

for i in `ls *.xlsx`; 
do  n1=`echo $i|cut -d '_' -f1`;  
t=`echo $n1.xlsx`; 
 mv $i $t;  
mv $t /home/test; 
done