bash encontrar usando variável

3

Eu tenho um problema que não entendo. É simples e deve funcionar, mas não funciona. = EDITADO exatamente o que posso ver no terminal = Eu tenho uma lista de nomes de arquivos:

[molni@archlinux picasa_album]$ cat LIST
IMG_9282.JPG
IMG_9287.JPG
IMG_9300.JPG
IMG_9324.JPG
IMG_9329.JPG
IMG_9463.JPG
IMG_9412.JPG
IMG_9562.JPG
IMG_9511.JPG
IMG_9607.JPG

e quer procurar por todos os arquivos na lista, é o caminho através do comando find:

[molni@archlinux picasa_album]$ for i in 'cat LIST'; do find /mnt/c/e-m10/  -name "$i";  done
[molni@archlinux picasa_album]$ 

sem resultados, quando eu trocá-lo por echo $ i (para verificar se a variável $ i está OK, funciona)

[molni@archlinux picasa_album]$ for i in 'cat LIST';do echo "$i" ;  done
IMG_9282.JPG
IMG_9287.JPG
IMG_9300.JPG
IMG_9324.JPG
IMG_9329.JPG
IMG_9463.JPG
IMG_9412.JPG
IMG_9562.JPG
IMG_9511.JPG
IMG_9607.JPG
[molni@archlinux picasa_album]$ 

quando eu faço manualmente, defina variável (sem loop) ele funciona:

[molni@archlinux picasa_album]$ i=IMG_9607.JPG
[molni@archlinux picasa_album]$ find /mnt/c/e-m10/ -name "$i"        
/mnt/c/e-m10/IMG_9607.JPG
[molni@archlinux picasa_album]$ 

O que estou fazendo de errado?

    
por molni 19.09.2014 / 08:48

3 respostas

6

Faça um cat -v LIST para ver se há algum caractere especial que você não vê com um eco simples. Eu suspeito de terminações de linha do DOS, ou seja, retornos de carro estranhos antes da nova linha.

EDIT: para converter o arquivo LIST:

dos2unix < LIST > LIST.new && mv LIST.new LIST

Ou se você não tem dos2unix, mas tem vim: vim LIST , então :set notx , então :wq

    
por 19.09.2014 / 10:03
0

Os seguintes trabalhos:

$ mkdir /tmp/test
$ cd /tmp/test
$ cat > LIST << EOD
> IMG_9324.JPG
> IMG_9329.JPG
> IMG_9463.JPG
> IMG_9412.JPG
> IMG_9562.JPG
> IMG_9511.JPG
> IMG_9607.JPG
> EOD
$ mkdir e
$ touch e/IMG_9607.JPG
$ touch e/IMG_9412.JPG
$ find .
.
./e
./e/IMG_9412.JPG
./e/IMG_9607.JPG
./LIST
$ for i in 'cat LIST'; do find e/  -name "$i";  done
e/IMG_9412.JPG
e/IMG_9607.JPG
$ 

Portanto, comece pelo acima, em seguida, substitua LIST pelo real e, em seguida, e/ . Se você não estiver atingindo um limite interno de Bash para o loop for (que deve lançar um erro), você deve estar fazendo algo errado, que não está na saída de exemplo.

    
por 19.09.2014 / 10:23
0

A nuvem fornece uma listagem de arquivos de amostra na pasta / mnt / c / e-m10 /?

Nesse meio tempo, você poderia tentar o comando abaixo?

for i in 'cat LIST'; do echo $i; find /mnt/c/e-m10/  -iname $i -print;  done

Isso imprimirá as informações necessárias, além de ignorar a diferenciação entre maiúsculas e minúsculas.

    
por 19.09.2014 / 10:27