我需要使用基于文本的浏览器 Lynx 将 1000 个 html 文件转储到具有相同文件名的文本文件中。
对于任何给定的 filename.html 命令是
lynx filename.html --force-html --dump > filename.txt
问题是我有数万个这样的文件。
如果我使用,lynx *.html --force-html --dump *.html
我不认为每个文件都会生成具有相同名称的文本文件。
答案1
您需要为lynx
每个文件执行一次,以生成单独的输出文件。要按顺序对多个文件执行某些操作,请使用for循环。这图案 *.html
匹配当前目录下所有名称以.html
.
for x in *.html; do … done
在循环的每次运行中,变量x
指定当前文件名。用于"$x"
引用文件名(不要忘记双引号,否则您的脚本将在某些文件名上中断,例如包含空格)。
要构建.txt
文件名,请.html
从 的值中删除后缀x
并添加.txt
后缀。有一个参数扩展构造以获取变量减去后缀的值:。"${VARIABLE%SUFFIX}"
for x in *.html; do
lynx --force-html --dump "$x" >"${x#.html}.txt"
done
如果您还想对子目录中的 HTML 文件进行操作,有两种可能性。如果您的 shell 是 bash、ksh 或 zsh,则可以使用该**
模式递归到子目录。在 bash 中,需要shopt -s globstar
首先启用此功能;以克什米尔为单位,与set -o globstar
.
shopt -s globstar
for x in **/*.html; do
lynx --force-html --dump "$x" >"${x#.html}.txt"
done
或者,使用find
命令。由于您需要对文件名进行一些操作,因此需要运行find
shell。
find . -name '*.html' -exec sh -c '
lynx --force-html --dump "$0" >"${0#.html}.txt"
' {} \;
$0
是 后的第一个参数。批量运行 shell 会更快一些,将(使用,指示将多个文件名传递给每个单个 shell 调用)与 for 循环相结合。意思是“迭代 shell 的命令行参数,除了”。sh -c CODE
find
-exec … {} +
find
for x do
$0
find . -name '*.html' -exec sh -c '
for x; do lynx --force-html --dump "$x" >"${x#.html}.txt"; done
' _ {} +
答案2
( set ./*.html; [ -f "$1" ] || exit
printf 'eval "$L;shift" >"${1%%%.0s.*}.txt"\n' "$@" |
L=' lynx "$1" --force-html --dump' sh -eCs "$@"
) &
答案3
for x in *.html;do
lynx $x --force-html --dump >${x%%.html}.txt
done