Consegui criar duas variáveis bash, ambas linhas de strings.
$oldfilenames
que parece
path/old-filename-1.txt
path/old-filename-2.txt
path/old-filename-3.txt
path/old-filename-4.txt
...
e
$newfilenames
que 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 read
capacidade 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 echo
está incluído para fins de teste].
Responder2
Não há nenhuma construção integrada para iterar em duas listas ao mesmo tempo. Uma for
instruçã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 oldfilenames
e newfilenames
forem 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