Criando um script que executa um comando simples para todos os arquivos em um diretório

0

Eu preciso usar o navegador baseado em texto Lynx para despejar 1000s de arquivos html em arquivos de texto, com o mesmo nome de arquivo.

Para qualquer filename.html dado, o comando é

lynx filename.html --force-html --dump > filename.txt

O problema é que tenho dezenas de milhares desses arquivos.

Se eu usei lynx *.html --force-html --dump *.html , não acredito que cada arquivo gere o arquivo de texto com o mesmo nome.

    
por hipHopMetropolisHastings 26.06.2015 / 06:33

3 respostas

3

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
' _ {} +
    
por 27.06.2015 / 15:26
1
( set ./*.html; [ -f "$1" ] || exit
  printf 'eval "$L;shift" >"${1%%%.0s.*}.txt"\n' "$@" |
  L='    lynx "$1" --force-html --dump'  sh -eCs "$@"
) &
    
por 26.06.2015 / 06:55
-2
for x in *.html;do
    lynx $x --force-html --dump >${x%%.html}.txt
done
    
por 26.06.2015 / 06:48