Logré crear dos variables bash, las cuales son líneas de cadenas.
$oldfilenames
que parece
path/old-filename-1.txt
path/old-filename-2.txt
path/old-filename-3.txt
path/old-filename-4.txt
...
y
$newfilenames
que parece
new-filename-1.txt
new-filename-2.txt
new-filename-3.txt
new-filename-4.txt
...
y me gustaría generar enlaces simbólicos en mi directorio usando estas dos variables.
Ambas variables tienen la misma longitud. Espero hacer algo como esto:
for x in $oldfilenames; y in $newfilenames; do
ln -s $x $y
done
Creo que esa no es la sintaxis correcta y no puedo hacer que funcione.
Respuesta1
No estoy seguro de que las cadenas delimitadas por nuevas líneas sean una buena manera de manejar secuencias de nombres de archivos (es posible que desee considerar el uso de matrices).
Sin embargo, dado que eso es lo que tienes, una combinación deaquí cuerdascon la read
capacidad incorporada para leer descriptores de archivos numerados podría funcionar:
while IFS= read -r -u3 x; IFS= read -r -u4 y; do
echo ln -s "$x" "$y"
done 3<<<"$oldfilenames" 4<<<"$newfilenames"
[ echo
Se incluye con fines de prueba].
Respuesta2
No hay ninguna construcción incorporada para iterar sobre dos listas al mismo tiempo. Una for
declaración itera sobre una lista.
Si estás usando un shell con matrices,no almacene listas como cadenas delimitadas por nueva línea, use matrices en su lugar.
Si oldfilenames
y newfilenames
son matrices, puede iterar sobre el índice de la matriz.
for ((i=0; i<${#oldfilenames[@]}; i++)); do
x=${oldfilenames[$i]}; y=${newfilenames[$i]}; …
done
Si necesita tener cadenas delimitadas por nuevas líneas, puede eliminar la primera línea, una línea a la vez.
nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
…
done