script não está funcionando

0

Sou muito novo no linux, estou tentando obter nomes de arquivos .ogg de um arquivo de texto e pegar arquivos mp3 de música de diretório e renomear e movê-los para um diretório diferente com o nome dessa linha de arquivo linha, mas não está funcionando. shellcheck.net mostra esta saída:

f referrenced but not assigned

Eu não consigo descobrir.

#!/bin/bash
while -r read f;
do
for mp3 in ./music/*; 
   do
     "mv $mp3 /home/shady/Music/$f"
                  ^––SC2154 f is referenced but not assigned.
   break
   done
done < /home/shady/piku.txt

Atualizar :

*

motegi_2004.ogg
assen_2004.ogg
phakisa_2004.ogg
donington_2004.ogg
catalunya_2004.ogg
strange_symbol.ogg
credits.ogg
philip_2004.ogg
jerez_2004.ogg
brno_2004.ogg
sepang_2004.ogg
estoril_2004.ogg
motogp.ogg
frontend.ogg
valencia_2004.ogg
lemans_2004.ogg
rio_2004.ogg
mugello_2004.ogg
sachsenring_2004.ogg
thqintro.ogg
qatar_2004.ogg
training_2004.ogg
climax.ogg

*

piku.txt contém estes nomes e as quebras de loop for depois de mover o primeiro arquivo como ogg em um diretório diferente, assim quando o loop de wile pega o próximo nome da linha 2 de piku.txt, o loop for pega o primeiro arquivo no diretório em nosso caso isso é o arquivo 2 porque nós já movemos o anterior para um diretório diferente. E não se preocupe com o bening mp3s renomeado como oggs, isso é apenas um teste. Eu só quero saber se isso funciona

editar: 2

 1  #!/bin/bash
   2  while read -r f
   3  do
   4    for mp3 in /home/shady/Desktop/music/* 
   5    do
   6                mv -i "$mp3" "/home/shady/Music/$f"
   7                break
   8    done
   9    done < /home/shady/piku.txt
  10  

Eu atribui caminho completo agora para o loop for, mas isso me dá

mv: cannot stat ‘/home/shady/Desktop/music/*’: No such file or directory

*

motegi_2004.ogg
assen_2004.ogg
phakisa_2004.ogg
donington_2004.ogg
catalunya_2004.ogg
strange_symbol.ogg
credits.ogg
philip_2004.ogg
jerez_2004.ogg
brno_2004.ogg
sepang_2004.ogg
estoril_2004.ogg
motogp.ogg
frontend.ogg
valencia_2004.ogg
lemans_2004.ogg
rio_2004.ogg
mugello_2004.ogg
sachsenring_2004.ogg
thqintro.ogg
qatar_2004.ogg
training_2004.ogg
climax.ogg

*

piku.txt contém estes nomes e as quebras de loop for depois de mover o primeiro arquivo como ogg em um diretório diferente, assim quando o loop de wile pega o próximo nome da linha 2 de piku.txt, o loop for pega o primeiro arquivo no diretório em nosso caso isso é o arquivo 2 porque nós já movemos o anterior para um diretório diferente. E não se preocupe com o bening mp3s renomeado como oggs, isso é apenas um teste. Eu só quero saber se isso funciona

editar: 2

 1  #!/bin/bash
   2  while read -r f
   3  do
   4    for mp3 in /home/shady/Desktop/music/* 
   5    do
   6                mv -i "$mp3" "/home/shady/Music/$f"
   7                break
   8    done
   9    done < /home/shady/piku.txt
  10  

Eu atribui caminho completo agora para o loop for, mas isso me dá

mv: cannot stat ‘/home/shady/Desktop/music/*’: No such file or directory

    
por Shantanu Bedajna 07.01.2016 / 08:03

1 resposta

4

O -r não está ajudando aqui, tente colocá-lo após o read .

Opcional: depois de while e for você precisa de ; ou de uma nova linha, mas não precisa dos dois! Como você tem novas linhas antes das palavras-chave do , é possível remover essas duas ; s.

As citações devem passar pelos argumentos, não pelo comando inteiro:

    mv -i "$mp3" "/home/shady/Music/$f"

Eu adicionei -i para que mv não tente sobrescrever nenhum arquivo existente.

Crucialmente, você tem um loop dentro de um loop. Você não pode mover um arquivo mp3 várias vezes! Se você quiser misturar dois conjuntos de nomes de arquivos, tente usar paste para extrair linhas de cada arquivo e combiná-las:

paste <(find ./music/* -maxdepth 1 -printf '"%p"\n') /home/shady/piku.txt | sed 's+^+mv -i +' > /tmp/move_my_files.sh

Depois, você pode ver o arquivo gerado e ver se ele faz o que você deseja.

(Pode ser necessário colocar aspas em torno de todos os nomes de arquivos em piku.txt, se eles contiverem espaços.)

Se você está feliz com a aparência do script move_my_files.sh , pode executá-lo:

bash -e -x /tmp/move_my_files.sh

Se eu entendi mal sua intenção, talvez seja necessário explicar melhor, incluindo o conteúdo do piku.txt e o resultado esperado, e como mp3 arquivos se tornam ogg arquivos!

    
por joeytwiddle 07.01.2016 / 08:26