bash: executa loop através de duas variáveis de string para criar links simbólicos

3

Eu consegui criar duas variáveis bash, ambas linhas de strings.

$oldfilenames , que se parece com

path/old-filename-1.txt
path/old-filename-2.txt
path/old-filename-3.txt
path/old-filename-4.txt
...

e

$newfilenames , que se parece com

new-filename-1.txt
new-filename-2.txt
new-filename-3.txt
new-filename-4.txt
...

e eu gostaria de gerar links simbólicos no meu diretório usando essas duas variáveis.

Ambas as variáveis são de igual comprimento. Eu espero fazer algo assim:

for x in $oldfilenames; y in $newfilenames; do 
  ln -s $x $y
done

Acho que não é a sintaxe correta e não consigo fazer funcionar.

    
por rmf 09.06.2016 / 18:59

2 respostas

2

Não tenho certeza se as strings delimitadas por nova linha são uma boa maneira de lidar com sequências de nomes de arquivos (você pode querer usar matrizes em vez disso).

No entanto, dado que é isso que você tem, uma combinação de aqui strings com a capacidade integrada do read de ler a partir de descritores de arquivos numerados pode funcionar:

while IFS= read -r -u3 x; IFS= read -r -u4 y; do 
  echo ln -s "$x" "$y"
done 3<<<"$oldfilenames" 4<<<"$newfilenames"

[o echo está incluído para fins de teste].

    
por 09.06.2016 / 19:21
2

Não há uma construção incorporada para iterar em duas listas ao mesmo tempo. Uma instrução for itera em uma lista.

Se você estiver usando um shell com matrizes, não armazena listas como strings delimitadas por novas linhas, use arrays .

Se oldfilenames e newfilenames forem matrizes, você poderá iterar no índice da matriz.

for ((i=0; i<${#oldfilenames[@]}; i++)); do
  x=${oldfilenames[$i]}; y=${newfilenames[$i]}; …
done

Se você tem que ter strings delimitadas por nova linha, pode retirar a primeira linha, uma linha de cada vez.

nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
  x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
  oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
  …
done
    
por 10.06.2016 / 02:28

Tags