GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Shell Script - Qual maneira recursiva posso alterar as coordenadas cartesianas[ X & Y ] de vários arquivos

programação
Tags: #<Tag:0x00007ffac82ef2a0>

#1

Sei que é mais fácil criar o arquivo do que editar seu conteúdo.

Veja o pseudo-código para exemplo didático:

#!/bin/bash

x0=100
y0=0

# incrementos
x_inc=100
y_inc=5

y_step=5

# quantidade de coordenadas desejadas
n_coords=50

for i in `seq 0 $(( n_coords - 1 ))`; do
    x=$(( x0 + i*x_inc ))
    y=$(( y0 + (i/y_step)*y_inc ))

    echo "X:$x Y:$y" > teste/$i
done

Explicação - Para fazer os cálculos. Eu incremento o valor de Y a cada 5 iterações, na razão de 5 unidades.

    x0 - é o valor inicial de x fornecido como 100
    y0 - é o valor inicial de y fornecido como 0
    x_inc -  é o quanto x tem o valor incrementado a cada salto fornecido como 100
    y_inc - é o quanto y tem o valor incrementado a cada salto fornecido como 5
    y_step - é o número de iterações antes de haver um incremento de y fornecido como 5

Para i no intervalo [0, 49]:

Por fim, a operação se resume com x e y .

Aqui a dúvida seria manipular vários arquivos em uma única pasta (com sed se possível) fazendo operações aritméticas.

Table Icon
Type: Program
Caption: Terminal
Command: aterm -T “Bash” -e /bin/bash
Icon: /home/user/.xtdesktop/Aterm.png
MenuCommand1: Aterm as Super User: aterm -cr red -e sudo su
X: 8
Y: 5
Status: anchor
end

Dá para fazer a substituição caso seja necessário usando o sed?

Ou por sinal, acham que não é possível, acham que awk seria mais adequado!?


#2

Como ja citado - “Sei que é mais fácil criar o arquivo do que editar seu conteúdo”.

Resolvi colocar aqui o que havia feito dantes de postar a pergunta somente pra registrar e talvez ajudar mais alguém que queira entender ou apreender até mesmo refazer a engenharia reversa/inversa como queira chamar a lógica de programação aqui apresentada.

Breve Explicação - O que esta solução faz é, nada mais e nada menos do que “re-criar” os arquivos .lnk necessários que carrega o ícone sobre o software e aponta para binário executável do mesmo.

Confira:

#!/bin/sh

DIR=/home/$USER/.xtdesktop

MONITOR=`xdpyinfo  | grep 'dimensions:'`
if [ -n "$MONITOR" ]
then
	RESOLUCAO_EM_USO=`echo $MONITOR | awk '{print $2}'`
fi

	A=`echo $MONITOR | awk '{print $2}' | cut -d'x' -f2`

	B='1024'

	if [ $A -lt $B ]
	then
	    # Se RESOLUCAO_EM_USO for menor que 1024x768
	    sed "9s/.*/Cols: 5/ ; 12s/.*/TopMargin: 4/" -i $DIR/xtdeskrc
	elif [ $A -gt $B ]
	then
	    # Se RESOLUCAO_EM_USO for maior que 1024x768
	    sed "9s/.*/Cols: 5/ ; 12s/.*/TopMargin: 6/" -i $DIR/xtdeskrc
	elif [ $A -eq  $B ]
	then
	    # Se RESOLUCAO_EM_USO for igual a 1024x768
	    sed "9s/.*/Cols: 5/ ; 12s/.*/TopMargin: 8/" -i $DIR/xtdeskrc
  	fi

function ICODESK(){

cd $DIR

QTD=$(ls -1 *.{jpg,png,gif,bmp,xpm} | wc -l) 

NUM=0

for ARQ in *.*
do
	FILE=$(echo $ARQ | tr 'A-Z' 'a-z')
 	mv -f $ARQ $FILE
done

ls -1 *.{jpg,png,gif,bmp,xpm} | while read EXT2
do
cat xtdeskpos/$1 | while read LINHA
do
if [ $NUM -lt $QTD ]
then
	echo -e  "Table Icon" > ${NUM%.*}
	echo -e  "\tCaption: ${EXT2%.*}" >> ${NUM%.*}
	echo -e  "\tIcon: .xtdesktop/$EXT2" >> ${NUM%.*}
	echo -e  "\tType: Program" >> ${NUM%.*}
	echo -e  "\tCommand: `which ${EXT2%.*}` `which ${EXT2/-*.*/}`" >> ${NUM%.*}
	echo -e  "\tMenuCommand1: Administrador: sudo `which ${EXT2%.*}` `which ${EXT2/-*.*/}`" >> ${NUM%.*}

  A=$(echo $LINHA | cut -d 'x' -f1)
  B=$(echo $LINHA | cut -d 'x' -f2)    

	echo -e  "\tX: $A \n\tY: $B" >> ${NUM%.*}
	echo -e  "\tStatus: anchor" >> ${NUM%.*}
	echo -e  "end" >> ${NUM%.*}
	mv -f $NUM ${EXT2%.*}.lnk
    	((NUM=$NUM+1))
      fi
  done
    	let NUM=`expr $NUM+1`
  done


# ls -1 ./*{png,lnk} | sed -r 's/\<./\U&/g' 

pkill xtdesk 2>/dev/null &

# for A in *.{png,gif,lnk}; do F=$(echo $A | sed -r 's/\<./\U&/g'); mv -f $A $F; done

cd ..

xtdesk &

}

ICODESK $RESOLUCAO_EM_USO

NOTA - Contudo feito, ainda ha o que fazer nesse shell script, uma vez que, se o binário referente ao aplicativo/programa tiver sido instalado em um diretório a parte, fora do escopo da variável de ambiente (PATH) compatível ao padrão POSIX o ícone da área de trabalho ficará inacessível, obrigando assim o usuário editar manualmente.

Quando surgi um tempo a mais irei deixar outra resposta com o modo que encontrei de alterar sem precisar recriar [co-criar] os arquivos *.lnk.