在一个目录中有很多文件夹.html里面,我希望所有HTML解析为新的.txt与父目录的名称。
Example1 / Index.html> Example1.txt
Example2 / Index.html> Example2.txt
在一个目录中有很多文件夹.html里面,我希望所有HTML解析为新的.txt与父目录的名称。
Example1 / Index.html> Example1.txt
Example2 / Index.html> Example2.txt
Answers:
显然,您希望将一些HTML页面转换为纯文本。因此,我不会使用自定义构建的解决方案剥离标记(例如,使用一些sed魔法),但是使用为此目的设计的工具,如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条件中)将值赋给变量$dirname
。最后,执行do
和done
get (s)之间的命令,这里它根据您的请求转换文件。正如@slhck所指出的,你需要使用这样一个复杂的命令,这样带有空格的dirnames就不会破坏任何东西。
[编辑]:转换当前目录下所有HTML文件的另一种变体:
find . -iname "*.html" -print0 | while IFS= read -r -d '' filename
do python path/to/html2text/html2text.py "${filename}" > "${filename%.*}.txt"
done
iname
搜索情况下我 nsensitive了*.html
。
${filename%.*}.txt
剥离延伸并附加.txt
,即如果filename
是some/path/index.html
,${filename%.*}
是some/path/index
,最后${filename%.*}.txt
是some/path/index.txt
。
当您使用Z shell时,您可以使用更清洁的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)
使用情况我 nsensitive匹配,一种**
递归搜索,因此返回当前工作目录下的所有HTML文件。(如果应遵循符号链接,请使用三颗星***
代替两颗星)。
如果在for循环中有多个命令,请使用大{ ... }
括号(这里不必要,但它们不会受到伤害)。
${i:r}
从变量中剥离扩展(r表示删除)$i
。
>
在第一个版本中忘记了重定向。现在它应该按照说明工作。(错误是,html2text期望作为可选的第二个参数HTML页面的编码,但得到了txt文件的名称)。
-print0
选项。请参阅:mywiki.wooledge.org/ParsingLs