我有多个名为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
发布于 2018-08-08 22:01:08
使用命令find
执行以下操作
-type f
)-exec rename.bash {} \;
)。Find递归遍历每个目录。
因此,完整的命令将如下所示:
find <YOUR TOP DIRECTORY> -type f -name output.html -exec rename.bash {} \; -print
最后的-print
将列出所有已处理的文件到标准输出。重命名脚本在参数中接收它找到的output.html的完整路径和文件名。因此,您必须执行sed命令,然后将接收到的参数的mv
传递给path/THE-TITLE-VALUE-YOU-JUST-EXTRACTED-WITH-SED.html
。
仅供参考,我建议您在重命名时要小心。文件名中的空格,尽管是完全“合法”的,但可能会在以后引起问题。还要确保您的标题不包含shell中的特殊字符,如*,!().
等。所有字母数字以及-
和_
都没问题。
发布于 2018-08-09 23:35:44
我能够通过编写以下脚本来解决这个问题:
#!/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
它的作用如下:
为位置中每个名为output.html的文件设置新文件名。
中有空格
现在我想找到一种方法来识别像/这样的特殊字符:因为当HTML标题中包含这些字符时,我会得到一个错误。
https://stackoverflow.com/questions/51747623
复制相似问题