根据我收到的here的有用答案,我创建了以下脚本,将其命名为convert_image_paths.command,将其放在我的mac上的网站文件夹中,然后双击它。
#!/bin/bash
# This script will operate on valid relative image paths at this level and one sub-level down, across .html and .css files.
find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/\.\.\/images\//images\//g' {} ';'
find . -name "*.css" -o -name "*.html" -exec sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {} ';'
不幸的是,不是将网站中的相对图像路径更改为新的cdn网址,而是
所以我的问题是a)是否有moron的标签和b)如何修复此脚本?
修改
让我澄清一下我的意图: 我想将更改应用于具有相对URL的所有图像路径
“图像/ {myimagepath}”
或
“../图像/ {myimagepath}”
答案 0 :(得分:4)
回答你的第二个问题:
b)不要“找到”。当你不知道脚本从哪个目录开始时。如果您希望它从特定目录开始,请在find命令中告诉它:find /Users/ptomblin/Shared/ ...
至于为什么它将网址加倍,这是因为你告诉了它。
sed -i '' 's/images\//http:\/\/mycdn\.com\/images\//g' {}
使用“images /”这个单词的每个实例并将其更改为“http://mycdn.com/images/”,即使它已经以“http://mycdn.com/”开头。如果这不是您想要的,那么您将需要更加具体地了解您的正则表达式。
作为第一次尝试,我会用以下
替换BOTH行find /Users/ptomblin/Shared -name "*.css" -o -name "*.html" -exec sed -i '' 's@".{0,2}/?images@"http://mycdn.com/images@g' {}
如果以双引号开头,则只会替换images
或../images
。
答案 1 :(得分:1)
find .
表示“在当前目录中查找” - 所以请确保从要在所有内容中进行此替换的目录中运行此命令,或者更改脚本以获取参数:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "usage: myscript <path>"
fi
find "$@" ...
我猜测为什么事情变得加倍只是因为它被运行了两次;您原始脚本中的第二个替换将显示“http://mycdn.com/images”并再次替换图像!这是结合两个替换并同时解决该问题的明显方法:
sed -i 's@"\(\.\./\|\)images/@"http://mycdn.com/images/@g'
与开放引号匹配,以确保在已经存在http:// ...时不替换,并且可选择匹配../之后。
我肯定建议在单个文件上调用此方法进行测试,结果打印到stdout而不是编辑到位:
sed 's@...@...@' <file>
答案 2 :(得分:1)
我还想出了为什么我的原始脚本无法识别它的当前目录。在mac上,如果使用.command扩展名命名脚本文件,则它将变为双击。但是,当您通过双击而不是从命令行执行它时,会将其工作目录更改为用户主目录!
myscript.command:
echo "pwd = `pwd`"
./ myscript.command: pwd =当前目录
myscript.command双击: pwd =用户主目录