在一个目录中有许多.html文件夹,我想将所有HTML解析为具有父目录名称的新.txt。
示例1/Index.html>示例1.txt
示例2/Index.html>示例2.txt
答案1
显然,您希望将某些 HTML 页面转换为纯文本。因此,我不会使用自定义解决方案(例如使用一些 sed magic)来删除标签,而是使用为此目的而设计的工具,例如html2text;摘自其网页:
html2text 是一个 Python 脚本,可将 HTML 页面转换为干净、易读的纯 ASCII 文本。更棒的是,该 ASCII 恰好也是有效的 Markdown(一种文本转 HTML 格式)。
解决批量重命名的问题:
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' dirname
do python path/to/html2text/html2text.py "${dirname}/index.html" > "${dirname}/${dirname}.txt"
done
在这里,find 命令列出仅位于当前目录中的所有目录(即非递归),并且 read 命令(在 while 条件中)将值赋给变量。最后,执行和get$dirname
之间的命令,这里它会根据您的要求转换文件。正如 @slhck 指出的那样,您需要使用这样一个复杂的命令,这样带有空格的目录名才不会破坏任何东西。do
done
[编辑]:另一种转换当前目录下所有 HTML 文件的变体:
find . -iname "*.html" -print0 | while IFS= read -r -d '' filename
do python path/to/html2text/html2text.py "${filename}" > "${filename%.*}.txt"
done
iname
搜查案件我不敏感*.html
。
${filename%.*}.txt
删除扩展名并附加.txt
,即,如果filename
是some/path/index.html
,${filename%.*}
则是some/path/index
,最后${filename%.*}.txt
是some/path/index.txt
。
当您使用Z壳,你可以使用更干净的 for 循环,而不会在空白处刹车:
for i (*(/)) python path/to/html2text/html2text.py "${i}/index.html" > "${i}/${i}.txt"
这里的技巧是*(/)
生成文件名,但只返回目录(/)
。
[编辑]:此外,在 zsh 语法中,还有转换当前目录下所有 HTML 文件的变体(您需要EXTENDEDGLOB
设置选项):
for i ((#i)**/*.html) {
python path/to/html2text/html2text.py "$i" > "${i:r}.txt"
}
(#i)
用例我不敏感的通配符,**
递归搜索,因此返回当前工作目录下的所有 HTML 文件。(如果需要遵循符号链接,请使用三颗星,***
而不是两颗星)。
如果 for 循环内有多个命令,请使用花{ ... }
括号(这里不需要,但不会造成损害)。
${i:r}
从变量中剥离扩展名(r 表示删除)$i
。