Script para limpar área de trabalho

Iniciado por Solid One, 22 de Junho de 2009, 22:07

tópico anterior - próximo tópico

Solid One

Bom, atualmente eu trabalho na biblioteca de uma universidade pública. Onde trabalho é uma espécie de "Cyber" gratuito com uns 36 computadores, todos com sistema operacional Ubuntu 9.04.

O Ubuntu tá todo personalizado pros usuários que estão mais familiarizados com o Windows. Ícones como os equivalentes ao "Meu Computador", ao "Meus Documentos" e à "Lixeira" estão na área de trabalho, e junto a eles estão ícones dos programas mais usados pelos alunos (Suíte OpenOffice e Gravador de Discos Brasero). Além disso, eles estão alinhados à direita, pois os ícones de pendrives e CDs aparecem à esquerda na área de trabalho.

Mesmo assim, os computadores são acessados por pessoas dos mais variados tipos, o que em questão de dias resulta numa área de trabalho toda poluída, cheia de arquivos salvos pelos alunos (documentos, imagens, às vezes músicas, etc). Aí sempre tinha que dar uma olhada em cada computador e "despoluir" a área de trabalho dele.

Pensando justamente em evitar esse trabalho sem fim, elaborei esse pequeno script para limpar a área de trabalho ao iniciar o computador:
Citar
#!/bin/sh
# Limpador de área de trabalho.
# Não execute-o como ROOT.
cd ~/Desktop

#MOVER PARA PASTA "/home/user/Documentos"
mv -f *.xlsx ~/Documentos
mv -f *.XLSX ~/Documentos
mv -f *.ppsx ~/Documentos
mv -f *.PPSX ~/Documentos
mv -f *.docx ~/Documentos
mv -f *.DOCX ~/Documentos
mv -f *.doc ~/Documentos
mv -f *.DOC ~/Documentos
mv -f *.pps ~/Documentos
mv -f *.PPS ~/Documentos
mv -f *.xls ~/Documentos
mv -f *.XLS ~/Documentos
mv -f *.odt ~/Documentos
mv -f *.ODT ~/Documentos
mv -f *.odp ~/Documentos
mv -f *.ODP ~/Documentos
mv -f *.ods ~/Documentos
mv -f *.ODS ~/Documentos
mv -f *.pdf ~/Documentos
mv -f *.PDF ~/Documentos
mv -f *.txt ~/Documentos
mv -f *.TXT ~/Documentos

#MOVER PARA A PASTA "/home/user/Imagens"
mv -f *.jpeg ~/Imagens
mv -f *.JPEG ~/Imagens
mv -f *.bmp ~/Imagens
mv -f *.BMP ~/Imagens
mv -f *.png ~/Imagens
mv -f *.PNG ~/Imagens
mv -f *.gif ~/Imagens
mv -f *.GIF ~/Imagens
mv -f *.jpg ~/Imagens
mv -f *.JPG ~/Imagens
mv -f *.jpe ~/Imagens
mv -f *.JPE ~/Imagens

#APAGAR TODO O RESTANTE DOS ARQUIVOS, COM EXCEÇÃO DOS ATALHOS PADRÕES NA ÁREA DE TRABALHO
mv *.desktop /tmp
rm -fr *
mv /tmp/*.desktop .

O que for de documento do MsOffice ou OOffice, arquivo de texto, site em HTML ou PHP salvo, ele move pra pasta "Documentos" no home do usuário. O que for de imagem (formatos mais populares), ele move pra pasta "Imagens" no home do usuário. De resto, ele apaga tudo e mantém só os atalhos da área de trabalho (os de extensão ".desktop")

Ele quebra o galho perfeitamente, e toda vez que ligo os computadores, a área de trabalho está limpa. Porém, queria deixar o script menos rústico, mais polido/elegante. E também fazer ele tomar menos linhas.

Alguém estaria disposto a me dar uma mãozinha?

Kamei Hyoga

Já tentou colocar na mesma linha?

Ex: mv -f *.xlsx *.XLSX *.ppsx ~/Documentos

Não testei isso, me veio na mente agora


Outra coisa é que em casos de jpg e jpeg, vc pode usar jp*g e JP*G. Assim ambos são movidos.

Não sei se no 9.04 a área de trabalho está nomeada como Desktop, mas no 8.04 é Área de Trabalho, então o Desktop seria alterado para Área\ de\ Trabalho/

Solid One

Citação de: Kamei Hyoga online 23 de Junho de 2009, 13:29
Já tentou colocar na mesma linha?

Ex: mv -f *.xlsx *.XLSX *.ppsx ~/Documentos

Não testei isso, me veio na mente agora

Hmm. Legal, funcionou! Ao menos com isso, agora o script vai ficar com 70% menos linhas que antes.

Citação de: Kamei Hyoga online 23 de Junho de 2009, 13:29
Outra coisa é que em casos de jpg e jpeg, vc pode usar jp*g e JP*G. Assim ambos são movidos.

Interessante isso. Será que se eu colocar *.doc* e *.DOC*, ele copiaria tanto arquivos em DOC como em DOCX?

Citação de: Kamei Hyoga online 23 de Junho de 2009, 13:29
Não sei se no 9.04 a área de trabalho está nomeada como Desktop, mas no 8.04 é Área de Trabalho, então o Desktop seria alterado para Área\ de\ Trabalho/

É, me lembro disso quando eu tive meu primeiro contato com Ubuntu na versão 8.04 ano passado. Desde o 8.10 deixaram de nomeá-la por "Área de Trabalho", e chuto eu que a tendência é esse termo manter-se inalterado por questões de unificação e facilidade. A área de trabalho é uma pasta essencial demais ao sistema. Tê-la com um nome com espaços e acentos pode complicar muito tanto na unificação como na facilidade.

Só não sei se, na tradução do Ubuntu das outras línguas, manteram esse termo intacto ou alterado. Caso tenham alterado, então acho que compensa elaborar formas de o script detectar se a pasta da área de trabalho se chama "Área\ de\ Trabalho" ou "Desktop".

Bom, o script se baseia totalmente por extensões, mas no linux é comum aparecer alguns arquivos sem extensão no nome, pois o Linux não reconhece arquivos por extensão como o Windows faz, e sim checando o header de cada arquivo. Um recurso bacana que gostaria de implementar é uma forma dele detectar o tipo de cada arquivo ao checar um determinado arquivo sem extensão, e em seguida renomeá-lo inserindo a devida extensão nele. O que me sugerem?

Kamei Hyoga

#3
Sim, pela lógica vai pegar todos os arquivos que terminem com .doc, incluindo .docx. Todos os arquivos, cuja extensão inicie com doc, seráo movidas. Funciona como no caso do jpeg e jpg.


Sobre a "Área de Trabalho", acho que fica só como detalhe mesmo, pois a pessoa que vai utilizar pode substituir o destino de forma bem rápida e fácil.

raidicar

Solid One, a pouco fiz um script para um outro usuário que pode, com pequena alteração, lhe ser muito util.
Pelo que entendi, você tem de executar o script para cada usuário e colocar na inicialização para cada usuário, acredito que deve estar deixando o comando salvo na opção sessões do menu de cada usuário ou algo parecido, dessa forma, ele é executado automaticamente quando o usuário faz login. Já com esse script, basta coloca-lo na inicialização do sistema.
O script, durante a inicialização pega os usuários que logam no sistema e grava instrução no arquivo .profile que fica oculto na pasta home de cada usuário.
Sempre que o usuário loga, o .profile é executado e, por consequencia, o comando dentro do mesmo também é executado. Ao criar um novo usuário, o script grava automaticamente, durante a inicialização, a instrução no arquivo .profile do novo usuário, instrução essa que efetua a limpeza do desktop.
Dessa forma, você terá o trabalho apenas de deixar o script rodando na inicialização do micro e nunca mais terá de mexer com ele, nem quando criar novos usuários e não vai ter a preocupação da possibilidade de rodar o script como root, não tem importancia, pois o script só funciona para usuários que tem um diretório na pasta /home, coisa que o root não tem.
Esse script é mais elegante e menos rustico, como deseja, se não entender o funcionamento, pergunte que eu ou outro usuário explica linha a linha.
#!/bin/bash
loop1=1
loop2=1
start=1
end=0
endloop2=`ls /home | wc -l`
endloop1=`getent passwd | cut -d \: -f1 | wc -l`
procura1=`getent passwd | cut -d \: -f1 | grep -n ^ | grep ^$loop1: | cut -d: -f2`
countloop=1
endloop1=`expr $endloop1 + $countloop`
until [ $start = $end ]; do
  procura1=`getent passwd | cut -d \: -f1 | grep -n ^ | grep ^$loop1: | cut -d: -f2`
  loop1=`expr $loop1 + $countloop`
  procura2=`ls /home | cut -d \: -f1 | grep -n ^ | grep ^$loop2: | cut -d: -f2`
    if [ $procura1 = $procura2 ]; then
      procprof1=`grep "mv *.do"`
        if [ ${#procprof1} -lt 2 ]; then
          echo "cd /home/$procura1/Desktop/" >> /home/$procura1/.profile
          echo "mv *.do* *.DO* *.xl* *.XL* *.pp* *.PP* *.od* *.OD* *.tx* *.TX* *.pd* *.PD* ../Documentos/" >> /home/$procura1/.profile
          echo "mv *.jp* *.JP* *.gi* *.GI* *.pn* *.PN* *.bm* *.BM* ../Documentos/" >> /home/$procura1/.profile
          echo "mv *.desktop /tmp/" >> /home/$procura1/.profile
          echo "rm -rf *" >> /home/$procura1/.profile
          echo "mv /tmp/*.desktop ." >> /home/$procura1/.profile
        fi
    fi
  if [ $loop1 = $endloop1 ] && [ $loop2 = $endloop2 ]; then
    start=0
    end=0
  fi
  if [ $loop1 = $endloop1 ]; then
    loop1=1
    loop2=`expr $loop2 + $countloop`
  fi
done

Teste-o bem antes de aplicá-lo nos demais micros.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.