Você precisa executar lynx
uma vez por arquivo para produzir arquivos de saída separados. Para fazer algo em vários arquivos em sequência, use um loop . O padrão *.html
corresponde a todos os arquivos no diretório atual cujo nome termina com .html
.
for x in *.html; do … done
Em cada execução do loop, a variável x
designa o nome do arquivo atual. Use "$x"
para se referir ao nome do arquivo (não esqueça as aspas duplas ou o seu script quebrará em alguns nomes de arquivos, por exemplo, contendo espaços).
Para criar o nome do arquivo .txt
, remova o sufixo .html
do valor de x
e adicione o sufixo .txt
. Há uma construção de expansão de parâmetro para obter o valor de uma variável menos um sufixo: "${VARIABLE%SUFFIX}"
.
for x in *.html; do
lynx --force-html --dump "$x" >"${x#.html}.txt"
done
Se você quiser atuar em arquivos HTML em subdiretórios, existem duas possibilidades. Se o seu shell é bash, ksh ou zsh, você pode usar o padrão **
para recorrer a subdiretórios. No bash, esse recurso precisa ser ativado com shopt -s globstar
primeiro; em ksh, com set -o globstar
.
shopt -s globstar
for x in **/*.html; do
lynx --force-html --dump "$x" >"${x#.html}.txt"
done
Como alternativa, use o comando find
. Como você precisa fazer alguma manipulação no nome do arquivo, é necessário fazer com que find
execute um shell.
find . -name '*.html' -exec sh -c '
lynx --force-html --dump "$0" >"${0#.html}.txt"
' {} \;
$0
é o primeiro argumento após sh -c CODE
. É um pouco mais rápido executar o shell em lotes, combinando find
(com -exec … {} +
, instruindo find
para passar vários nomes de arquivos para cada invocação de shell) com um loop for. for x do
significa “iterar sobre os argumentos da linha de comando do shell, exceto $0
”.
find . -name '*.html' -exec sh -c '
for x; do lynx --force-html --dump "$x" >"${x#.html}.txt"; done
' _ {} +