Como posso percorrer as linhas de um arquivo e encontrar arquivos correspondentes a cada linha?

3

Em um shell BASH, eu gostaria de pegar as linhas de um arquivo (por exemplo, pattern.txt ) e encontrar os arquivos no meu sistema cujos nomes contêm os padrões em cada linha do meu arquivo. Então, eu tenho o seguinte para loop

for pp in 'cat pattern.txt'; do find ./ -iname "*${pp}*" -print0; done

que não encontra nenhum arquivo quando a primeira linha do pattern.txt existe. Então, como posso corrigir a linha de comando acima?

Nota: cada linha do meu arquivo contém apenas caracteres [a-zA-Z].

    
por Azim 01.04.2011 / 23:29

3 respostas

2

Tente isto:

#!/bin/bash

while IFS= read -r pp; do
  find . -iname "*${pp}*" -print0
done < /path/to/pattern.txt

Não sei por que você quer -print0 , mas deixei de lado mesmo assim. Talvez você esteja tentando canalizar isso para xargs ?

    
por 01.04.2011 / 23:35
4

Aqui está uma maneira segura e à prova de Windows de procurar por um monte de padrões de nome de arquivo recuperados de um arquivo. A abordagem que escolhi é processar a lista de padrões em uma expressão find .

find_expression=$(<pattern \
    sed -e 's/^/-o\n-iname\n*/' \
        -e 's/\r\?$/*/' |            # turn each pattern into -o -iname *foo*
    tail -n +2)                      # remove spurious initial -o
set -f                               # turn off globbing
IFS='
'                                    # split only at newlines
find . \( $find_expression \) -print0
set +f; unset IFS                    # restore defaults
    
por 02.04.2011 / 00:32
2

A resposta que o @SiegeX apresenta funcionará, mas se você tiver muitos arquivos em seu arquivo padrão, isso pode se tornar lento e desajeitado. Você pode obter um desempenho muito melhor usando uma ferramenta diferente, como esta:

find . | grep -f pattern.txt

Sim, essa foi a coisa toda.

    
por 02.04.2011 / 17:04