创建一个脚本,对目录中的所有文件运行一个简单的命令

创建一个脚本,对目录中的所有文件运行一个简单的命令

我需要使用基于文本的浏览器 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命令。由于您需要对文件名进行一些操作,因此需要运行findshell。

find . -name '*.html' -exec sh -c '
  lynx --force-html --dump "$0" >"${0#.html}.txt"
' {} \;

$0是 后的第一个参数。批量运行 shell 会更快一些,将(使用,指示将多个文件名传递给每个单个 shell 调用)与 for 循环相结合。意思是“迭代 shell 的命令行参数,除了”。sh -c CODEfind-exec … {} +findfor 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

相关内容