正则表达式匹配文件和重命名+覆盖旧文件

时间:2015-08-20 15:35:43

标签: regex linux bash

我试图制作一个bash脚本来重命名一些与我的正则表达式匹配的文件,如果它们匹配,我想用正则表达式重命名它们并覆盖旧的现有文件。

我想这样做是因为在计算机1上我有一个文件,在计算机2上我更改了文件。后来我回到计算机1,它给出了一个示例冲突,因此它可以保存它们。

示例文件:

  

acl_cam.MYI

冲突后的示例文件:

  

acl_cam(例如2015-08-20中的......).MYI

我尝试了很多想法,比如重命名,mv和其他几个脚本,但它没有用。

我认为应该使用正则表达式:

(.*)/s\(.*\)\.(.*)

然后将其重命名为value1。 value2并替换旧文件(acl_cam.MYI)并对其开始的所有文件/目录执行此操作

你们可以帮帮我这个吗?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你所遇到的问题是两个部分。 (1)与错误字符串匹配并生成文件名的正确正则表达式是什么? (2)如何使用返回的文件名来移动/删除有问题的文件?

如果问题是:

acl_cam (Example conflit with .... on 2015-08-20).MYI

并且您需要返回MySQL文件名,然后类似于以下的正则表达式将起作用:

[ ][(].*[)]

流编辑器sed与从字符串中返回文件名的其他内容一样好。例如:

$ printf "acl_cam (Example conflit with .... on 2015-08-20).MYI\n" | \
  sed -e 's/[ ][(].*[)]//'
acl_cam.MYI

(在上面的续行中显示)

然后由您决定如何移动或删除文件。剩下的问题是当前存储的信息(错误字符串)在哪里以及如何访问它?如果您有一个充满这些错误的文件,那么您可以执行以下操作:

while read -r line; do

    victim=$( printf "%s\n" "$line" | sed -e 's/[ ][(].*[)]//' )

    ## to move the file to /path/to/old
    [ -e "$victim" ] && mv "$victim" /path/to/old

done <$myerrorfilename

(您也可以将字符串作为 here-string 提供给sed,但为简单起见省略了)

如果符合您的目的,您也可以删除该文件。但是,需要更多信息来阐明信息的存储方式/位置以及您希望如何使用它来提供更具体的信息。如果您还有其他问题,请与我们联系。

答案 1 :(得分:0)

此问题的最终解决方案适用于有兴趣的人:

for i in *; do
   #Wildcar check if current file containt (Exemplaar
   if [[ $i == *"(Exemplaar"* ]]
    then
      #Rename the file to the original name (without Exemplaar conflict)
      NewFileName=$(echo "$i" | sed -E -e 's/[ ][(].*[)]//')
      #Remove the original file
      rm $NewFileName;
      #Copy the conflict file as the original file name
      cp -a "$i" $NewFileName;
      #Delete the conflict file
      rm "$i";
      echo "Removed file: $NewFileName with: $i";
    fi
done

我使用此代码替换由不同计算机的dropbox同步创建的数据库冲突文件。