我正在尝试制作一个 bash 脚本来重命名一些与我的正则表达式匹配的文件,如果它们匹配,我想使用正则表达式重命名它们并覆盖旧的现有文件。
我想这样做是因为在计算机 1 上我有一个文件,在计算机 2 上我更改了该文件。后来我回到计算机 1,它给出了一个示例冲突,因此它保存了它们。
示例文件:
acl_cam.MYI
冲突后的示例文件:
acl_cam (Example conflit with .... on 2015-08-20).MYI
我尝试了很多想法,比如重命名、mv 和一些其他脚本,但没有成功。
我认为我应该使用的正则表达式:
(.*)/s\(.*\)\.(.*)
然后将其重命名为 value1 。 value2 并替换旧文件 (acl_cam.MYI),并对它开始处的所有文件/目录执行此操作
你们能帮我解决这个问题吗?
最佳答案
如果我正确理解你的问题,你遇到的问题分为两部分。 (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
,但为了简单起见省略)
如果适合您的目的,您也可以删除该文件。但是,需要更多信息来阐明该信息的存储方式/位置以及您到底想用它做什么以提供更多细节。如果您还有其他问题,请告诉我。
关于文件的正则表达式匹配并重命名+覆盖旧文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32122486/