重命名html php文件中图像文件名中的所有空格

重命名html php文件中图像文件名中的所有空格

在不同的 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 与平面文件格式相互转换,适合与面向行的工具(如sedgrepawk等)一起使用。

它还包含用于处理 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' {} \;

这将打开所有文件,查看内部,但不会改变任何内容。有什么建议么?

相关内容