Lê o arquivo e combina com o nome do arquivo

1

Eu tenho um arquivo de texto que estou tentando ler. Vamos dizer que o foo.txt contém:

foo.org
foo.com
foo.net
foo
bar.org
bar.com
bar
blah.org
example.org

E eu preciso ler este arquivo e o grep para correspondência de padrões em nomes de arquivos (NÃO conteúdo dentro dos arquivos)

Todos os nomes de arquivos serão algo como:

foo.org.db foo.com.db bar.org.db

(Todos eles terão .db no final, pois são arquivos de zona).

Eu tenho tentado algo como:

#!/bin/bash
FILE=foo.txt
DIR=/path/to/zone/files
MATCH=match.txt
NO_MATCH=nomatch.txt

read -r line; do
   for a in $DIR
   do  
       if [ line =~ $a ]
       then
          echo "$line" >> "$MATCH"
       else
          echo "$line" >> "$NO_MATCH"
   done
done< $FILE 

Ao executar este script, vejo $ MATCH criado, mas nunca $ NO_MATCH. E não parece que os condicionais estejam funcionando. Eu realmente preciso de algo que não corresponda a ser gravado em um arquivo de texto. Por exemplo, se example.org for escrito na variável $ FILE, mas não houver correspondência de nome de arquivo (no example.org.db), o exemplo.org deverá ser gravado em $ NO_MATCH. O que estou fazendo errado?

    
por ryekayo 16.08.2017 / 16:58

1 resposta

2

Não há necessidade do loop interno e há um while ausente:

while read -r name; do
    files=$( echo "$DIR/$name"* )
    if [[ "$files" != "$DIR/$name"* ]]; then
        echo "$name" >>"$MATCH"
    else
        echo "$name" >>"$NO_MATCH"
    fi
done <"$FILE"

echo "$DIR/$name"* expandirá para todos os nomes de arquivos correspondentes ao padrão fornecido. Se não houver nomes de arquivos correspondentes a esse padrão, o padrão permanecerá não expandido.

    
por 16.08.2017 / 17:04