从HTML提取标题并将文件重命名为标题

时间:2018-08-08 13:09:57

标签: html bash rename title mv

我有多个文件名为output.html。我想提取他们的标题,可以使用以下命令成功完成此操作:

cat output.html | sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q'

示例:

7N8UGL0:~/Downloads$ cat output.html | sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q'
SEIKO 5 Finder - SNK559 Automatic Watch

现在我想将output.html重命名为提取的标题:

SEIKO 5 Finder - SNK559 Automatic Watch.html

我已经设法将其放入脚本中

#!/bin/bash
title=`cat output.html | sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q'`
echo $title

此外,在以时代时间格式命名的目录中,我有很多此类output.html文件

ls -l
drwxrwxrwx 1 userna userna 512 Aug  7 19:33 1500122724.81
drwxrwxrwx 1 userna userna 512 Aug  7 19:33 1500122724.82
drwxrwxrwx 1 userna userna 512 Aug  7 19:33 1500122724.83
drwxrwxrwx 1 userna userna 512 Aug  7 19:32 1500122724.84
drwxrwxrwx 1 userna userna 512 Aug  7 18:36 1500122724.85
drwxrwxrwx 1 userna userna 512 Aug  7 18:35 1500122724.86

我希望能够提取所有目录中所有output.html的html标题,并相应地重命名output.html。

在此先感谢

jmt

2 个答案:

答案 0 :(得分:1)

使用命令find

  • 处理所有文件(-type f
  • 名称为output.html(-名称output.html)。
  • 在它们上运行您的重命名脚本(-exec rename.bash {} \;)。

查找是对每个目录的递归。

因此完整的命令应如下所示:

find <YOUR TOP DIRECTORY> -type f -name output.html -exec rename.bash {} \; -print

最后的-print将列出所有已处理的文件到stdout。 您的重命名脚本在参数中接收找到的output.html的完整路径和文件名。因此,您将必须先执行sed命令,然后再从您收到的mv参数中提取一个path/THE-TITLE-VALUE-YOU-JUST-EXTRACTED-WITH-SED.html

仅供参考,我建议您在重命名时要小心。文件名中的空格尽管完全“合法”,但以后可能会引起问题。请确保您的标题也不要在外壳程序中包含特殊字符,例如*,!().等。所有的字母数字以及-_都可以。

答案 1 :(得分:0)

我能够通过编写以下脚本来解决此问题:

#!/bin/bash
for file in $(find . -name output.html)
do
newfilename=`cat $file |  sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q'`
mv $file "$newfilename.html"
done

它的作用如下:

  1. 对于位置中每个名为output.html的文件。
  2. 设置与提取的标签相等的变量“ newfilename”(例如“ SEIKO 5 Finder-SNK559自动手表”
  3. 将$ file从1.重命名为newfilename的值。对于“ $ newfilename”,由于文件名中的空格,我使用了引号

现在,我想找到一种方法来识别/:之类的特殊字符,因为当HTML标题中包含任何这些字符时,我会收到一条错误消息。