我有一个文件夹,里面有一堆按顺序编号的 html 文件(file1.html、file2.html 等)。
我想根据每个文件中的标签重命名每个文件。
因此,如果 file1.html 包含<title>Page Name</title>
,我希望脚本重命名该文件Page Name.html
。
我如何在 Linux 上执行此操作?
答案1
假设您的文档格式良好,这将是一个非常简单的方法:
#!/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
Perl 正则表达式。有前瞻和后瞻来过滤掉实际的 HTML 标签并仅获取标题。这是一个看起来很复杂的正则表达式,但您无法轻松地仅使用 输出捕获的内容grep
。 - 确保始终引用你的变量(
"$f")
这样如果文件名称中有空格,整个过程仍然可以正常工作。 - 默认情况下
mv
将覆盖现有文件。使用mv -i
可避免这种情况,并让您的 shell 在覆盖之前提示您。 - 除字母、数字、
.
、_
和-
以及空格之外的任何字符都将从文件名中删除。我们使用子串替换。 - 要删除所有空格,使用
mv -i "$f" "${title//[^a-zA-Z0-9\._\-]}".html
- 要保持实际页面标题不变,只需使用
mv "$f" "$title".html
。