我有多个文件名为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
答案 0 :(得分:1)
使用命令find
-type f
)-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
它的作用如下:
现在,我想找到一种方法来识别/:之类的特殊字符,因为当HTML标题中包含任何这些字符时,我会收到一条错误消息。