Como faço para encontrar um arquivo que corresponda apenas a uma string entre caracteres curinga?

0

Eu tenho que encontrar um arquivo com apenas um determinado número e uma string. Ito encontrar 856 entre curingas *856* .

por exemplo. Eu tenho este fileA.txt com milhares de números:

45423542354235423542
5423543542353254235
345435245243
435435345
452345345
4523543455454

Eu tenho este script:

#!/bin/sh

findFile() {
    while read -r LINE
    do
         printf "$LINE\n"
         grep -il "$LINE" *856*
         printf "\n"
    done < /path/to/fileA.txt > /path/to/result.txt
}

findFile

EDITAR: Os nomes dos arquivos não contêm o padrão de fileA.txt .

Saída desejada:

45423542354235423542
found_file_856_COMPANY_FFW3443E.dat

5423543542353254235
found_file_856_COMPANY_43R43F.dat

345435245243
found_file_856_COMPANY_77Y85HHH.dat

435435345
found_file_856_COMPANY_64Y76H6.dat

452345345
found_file_856_COMPANY_9630GGTFVF.dat

4523543455454
found_file_856_COMPANY_2R98JD925.dat
    
por WashichawbachaW 11.10.2017 / 11:28

2 respostas

1

Supondo que nenhum nome de arquivo tenha novas linhas nelas ...

Crie uma lista dos " 856 -files" e use grep para filtrar os que você deseja:

find . -name '*856*' > filelist
grep -Ff fileA.txt filelist >result.txt

O comando grep usará as sequências em fileA.txt como padrões e extrairá os nomes de filelist que correspondem a eles. O -F flag garantirá que as strings em fileA.txt sejam interpretadas como strings fixas (não como expressões regulares).

Os padrões em fileA.txt podem precisar ser mais específicos, por exemplo, prefixando-os com _ e adicionando o sufixo .dat :

sed -e 's/^/_/' -e 's/$/.dat' fileA.txt >fileB.txt

Você usaria fileB.txt com o grep em vez de fileA.txt .

    
por 11.10.2017 / 11:45
1

Não está claro o que você está fazendo em sua pergunta (ou seja, o que você está tentando alcançar?) ou qual shell está usando. Infelizmente eu não tenho o representante. comentar.

Supondo que você esteja usando o bash shell; Se você estiver tentando encontrar um padrão globbing que retorne todos os arquivos na pasta atual contendo a string 856, então *856* é o caminho correto.

Para esclarecer, se você quiser procurar sausages dentro de todos os arquivos com nome contendo a string snacks_for_later , então você usaria

    $ grep sausages *snacks_for_later*

para encontrar salsichas.

Para verificar se você está pesquisando nos arquivos corretos, teste seu padrão de globbing usando ls:

    $ ls *856*

Se você não estiver executando os comandos da pasta em que os arquivos estão, precisará usar o padrão /path/to/allfiles/*856* para grep e ls. Padrões glob (como '*') não atravessam diretórios.

    
por 11.10.2017 / 11:45