bash: percorre duas variáveis ​​​​de string para criar links simbólicos

bash: percorre duas variáveis ​​​​de string para criar links simbólicos

Consegui criar duas variáveis ​​​​bash, ambas linhas de strings.

$oldfilenamesque parece

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

e

$newfilenamesque parece

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

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

Ambas as variáveis ​​​​têm o mesmo comprimento. Espero fazer algo assim:

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

Acho que essa não é a sintaxe correta e não consigo fazê-la funcionar.

Responder1

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

No entanto, dado que é isso que você tem, uma combinação deaqui cordascom a readcapacidade interna de ler 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 echoestá incluído para fins de teste].

Responder2

Não há nenhuma construção integrada para iterar em duas listas ao mesmo tempo. Uma forinstrução itera em uma lista.

Se você estiver usando um shell com arrays,não armazene listas como strings delimitadas por nova linha; em vez disso, use arrays.

Se oldfilenamese newfilenamesforem arrays, você poderá iterar no índice do array.

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

Se você precisar de strings delimitadas por nova linha, poderá remover a primeira linha, uma linha por vez.

nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
  x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
  oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
done

informação relacionada