我是一个相对较新的编程人员。我有一个文件夹,包含子文件夹,其中包含几千个通常命名的html文件,即1006.htm,1007.htm,我想使用文件中的标记重命名。
例如,如果文件1006.htm包含页面标题,我想将其重命名为Page Title.htm。理想情况下,空格会用短划线替换。
我一直在使用bash脚本在shell中工作而没有运气。我怎么做这个,用bash或python?
这是我到目前为止所拥有的......
#!/usr/bin/env bashFILES=/Users/Ben/unzipped/*
for f in $FILES
do
if [ ${FILES: -4} == ".htm" ]
then
awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' $FILES
fi
done
我也试过
#!/usr/bin/env bash
for f in *.html;
do
title=$( grep -oP '(?<=<title>).*(?=<\/title>)' "$f" )
mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html
done
但我从终端得到一个错误,说明如何使用grep ......
答案 0 :(得分:1)
在bash脚本中使用awk而不是grep,它应该可以工作:
#!/bin/bash
for f in *.html;
do
title=$( awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f" )
mv -i "$f" "${title//[^a-zA-Z0-9\._\- ]}".html
done
不要忘记在第一行更改你的bash环境;)
编辑所有修改的完整答案
#!/bin/bash
for f in `find . -type f | grep \.html`
do
title=$( awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f" )
mv -i "$f" "${title//[ ]/-}".html
done
答案 1 :(得分:0)
您希望使用HTML解析器(如lxml.html
)来解析HTML文件。一旦你有了这个,检索标题标签是一行(可能是page.get_element_by_id("title").text_content()
)。
将其翻译成文件名并重命名文档应该是微不足道的。
答案 2 :(得分:0)
这是我刚写的一个python脚本:
import os
import re
from lxml import etree
class MyClass(object):
def __init__(self, dirname=''):
self.dirname = dirname
self.exp_title = "<title>(.*)</title>"
self.re_title = re.compile(self.exp_title)
def rename(self):
for afile in os.listdir(self.dirname):
if os.path.isfile(afile):
originfile = os.path.join(self.dirname, afile)
with open(originfile, 'rb') as fp:
contents = fp.read()
try:
html = etree.HTML(contents)
title = html.xpath("//title")[0].text
except Exception as e:
try:
title = self.re_title.findall(contents)[0]
except Exception:
title = ''
if title:
newfile = os.path.join(self.dirname, title)
os.rename(originfile, newfile)
>>> test = MyClass('/path/to/your/dir')
>>> test.rename()