Como executar um comando find usando um conjunto de strings de uma linha em um arquivo de texto

1

Este é o conteúdo do meu arquivo de texto chamado fnames.txt:

"SAMPLE_NIKE_856_20170703*"
"SAMPLE_ADIDAS_856_20170702*"
"SAMPLE_ANTA_856_20170630*"
"SAMPLE_JORDAN_856_20170627*"
"SAMPLE_CONVERSE_856_20170229*"

Este é o meu script chamado fn.sh:

#!/bin/sh
#
#
while read LINE
do
    find -name "$LINE"
done < fnames.txt

Não retorna nada.

O que eu quero que aconteça é que em cada linha o script irá executar o comando find e a saída será armazenada em outro arquivo de texto chamado files.txt, por exemplo:

LINHA 1:

find -name "SAMPLE_NIKE_856_20170703*"

retorna o nome do arquivo que está procurando

./SAMPLE_NIKE_856_20170703_80_20_304_234_897.dat

LINHA 2:

find -name "SAMPLE_ADIDAS_856_20170702*

retorna o nome do arquivo que está procurando

./SAMPLE_ADIDAS_856_20170702_56_98_123_245_609.dat

O script continuará até que todas as linhas tenham sido executadas pelo comando find.

    
por WashichawbachaW 05.07.2017 / 04:37

3 respostas

0

Eu finalmente encontrei a resposta. Eu só preciso chamar o caminho completo do arquivo fnames.txt para /path/to/my/fnames.txt porque estou executando o script em outro diretório.

#!/bin/sh
#
#
while read -r LINE
do
    find -name "$LINE"
done < /path/to/my/fnames.txt

Saída:

./SAMPLE_NIKE_856_20170703_80_20_304_234_897.dat
./SAMPLE_ADIDAS_856_20170702_56_98_123_245_609.dat
    
por 05.07.2017 / 10:44
3

O motivo é a ordem em que o shell processa as várias expansões e cotações. Se você digitar diretamente

find . -name "foo*"

O shell removerá as cotas e transmitirá foo* como parâmetro para find .

Sem as aspas, o shell executaria a globbing para o * primeiro, resultando potencialmente em várias correspondências que confundiriam find . Por isso, é aconselhável usar as aspas.

Mas se você read da string de um arquivo, a variável conterá as aspas. Agora, quando você faz

> echo $LINE
"foo*"
> echo "foo*"
foo*
> find . -name $LINE

você vê que as aspas de $LINE não serão removidas em oposição às de echo "foo*" . Isso ocorre porque o shell primeiro manipula as cotações de echo $LINE (não há nenhuma) e, em seguida, executa a substituição de variável, portanto, a linha lerá echo "foo*" , mas agora as aspas permanecem.

Portanto, o seu find procurará arquivos contendo as citações. A solução é deixar as cotações no arquivo. Não é necessário citar lá, a linha completa irá para a variável.

    
por 05.07.2017 / 08:18
1

Modifique o IFS para ler como:

while IFS=\" read -r x LINE x; do
   find . -name "$LINE"
done < fnames.txt

Isso basicamente ** elimina as aspas ** e o $LINE será o que você precisa para o find funcionar corretamente. O que ele faz é dividir a linha de leitura entre aspas e assim eles não aparecerão em $ LINE.

    
por 05.07.2017 / 10:34