我试图制作一个bash脚本来重命名一些与我的正则表达式匹配的文件,如果它们匹配,我想用正则表达式重命名它们并覆盖旧的现有文件。
我想这样做是因为在计算机1上我有一个文件,在计算机2上我更改了文件。后来我回到计算机1,它给出了一个示例冲突,因此它可以保存它们。
示例文件:
acl_cam.MYI
冲突后的示例文件:
acl_cam(例如2015-08-20中的......).MYI
我尝试了很多想法,比如重命名,mv和其他几个脚本,但它没有用。
我认为应该使用正则表达式:
(.*)/s\(.*\)\.(.*)
然后将其重命名为value1。 value2并替换旧文件(acl_cam.MYI)并对其开始的所有文件/目录执行此操作
你们可以帮帮我这个吗?答案 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同步创建的数据库冲突文件。