在不同的 htm.gz、html.gz 和 php.gz Web 文件中,我有图像,.jpg 格式的图像的名称带有空格而不是“-”,但在所有图像所在的 /images/ 目录中,它们有“-” “而不是空间
在 html 文件中我有“<img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">
在目录“/images/”中,所有内容都在单词之间用“-”列出,例如“red-roses-in-summer-54.jpg”
所以,我想要的是一个 bash 命令/脚本,它可以搜索 /var/www/domain.com 内的所有 htm.gz、html.gz 和 php.gz 文件,找到所有 .jpg 图像并将空格替换为“-”。所以从 /images/red Roses in Summer 54.jpg 到 /images/red-roses-in-summer-54.jpg
如果重要的话服务器运行在centos 7上。
答案1
perl
理想情况下,这应该使用像或python
那样具有良好 HTML 解析库的语言来完成。但如果你想在 shell 脚本中完成它,你可以安装XML2包,它提供了名为html2
和 的工具2html
,用于将 HTML 与平面文件格式相互转换,适合与面向行的工具(如sed
、grep
、awk
等)一起使用。
它还包含用于处理 XML 和 CSV 文件的类似工具。
然后您可以使用sed
将匹配线上的空格转换img src
为破折号。然后再转换回html。
例如,使用您的示例 html 行:
$ cat file.html
<img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">
$ html2 < file.html | sed -e '\:/img/@src=/images/: s/ /-/g' | 2html
<html><body><img class="photo" width="400" height="600" src="/images/red-roses-in-summer-54.jpg" alt="">
将输出重定向到,例如file.new.html
.然后mv -f file.new.html file.html
如果您想用修改后的版本替换原始文件。我强烈建议保留原始文件的备份副本,以便在出现错误时可以恢复到已知良好的起点。
顺便说一句,生成的平面文件格式html2
如下所示:
$ html2 < file.html
/html/body/img/@class=photo
/html/body/img/@width=400
/html/body/img/@height=600
/html/body/img/@src=/images/red roses in summer 54.jpg
/html/body/img/@alt
xml2
为 Debian 和 Ubuntu 以及可能其他 Linux 发行版打包。如果它没有为您的 UNIX 预先打包,您可以在上面的链接中找到源代码。
有多种方法可以对大量文件进行这些更改。这是一个简单的for
循环示例。
for htmlfile in *.html ; do
html2 < "$htmlfile" |
sed -e '\:/img/@src=/images/: s/ /-/g' |
2html > "$htmlfile.new" \
&& mv -f "$htmlfile.new" "$htmlfile"
done
警告:测试这是否符合您的预期前在大量 HTML 文件上运行它。并保留原件的备份。如果您的文件中的 HTML 不是完全有效的 HTML(即,如果它无法通过 HTML 语法检查器),则html2 | ... | 2html
可能会使您的 html 文件比现在更加糟糕。
如果文件太多,或者文件位于多个子目录中,则必须使用find ... -exec
.find
本网站上有无数使用此处的示例。
答案2
我发现了一些东西,但效果不佳:
find /var/www/domain.com -type f ! \( -name '*.db' -o -name '*.sqlite' -o -name '*.feed' -o -name '*.com' -o -name '*.xml' -o -name '*.gz' -o -name '*.txt' -o -name '*.pdf' -o -name '*.js' -o -name '*.css' -o -name '*.ico' -o -name '*.gif' -o -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) -maxdepth 1 -exec sed -e '\:/img/@src=/images/: s/ /-/g' {} \;
这将打开所有文件,查看内部,但不会改变任何内容。有什么建议么?