você está aqui: Home  → Arquivo de Mensagens

Brincando com o Nautilus, Caja, Nemo, etc

Colaboração: Julio Cezar Neves

Data de Publicação: 24 de março de 2021

Quando escrevi este artigo, o navegador padrão do Gnome era o Nautilus. Hoje, toda hora vemos pessoas utilizando o Caja (ainda não consegui enxergar nenhuma diferença em relação ao primeiro), mas a verdade é que, em termos de script, o Caja faz tudo que o Nautilus faz. Neste mesmo parágrafo, onde escrevi "Hoje, toda hora vemos pessoas utilizando o Caja", posso dizer que o Caja já era, agora é o Nemo! Assim fica difícil...

Como esta seção foi toda escrita para o Nautilus, deixo para vocês fazerem as correções necessárias a fim de não tornar a leitura redundante e enfadonha. As diferenças que podem afetar serão mostradas.

Por exemplo, no parágrafo seguinte, está escrito: "O Nautilus permite que você crie seus próprios scripts e ..." e assim continuará, mas se você usa o Caja, leia "O Caja permite que você crie seus próprios scripts e ... ?.

O Nautilus permite que você crie seus próprios scripts e os incorpore ao seu ambiente de forma a facilitar a sua vida. Scripts são tipicamente mais simples em operação que extensões do Nautilus e podem ser escritos em qualquer linguagem de script que possa ser executada no seu computador. Para executar um script, escolha "Arquivo → Scripts", e então escolha o script que você quer executar a partir do submenu.

Você também pode acessar scripts a partir do menu de contexto, isto é, clicando no botão da direita.

Se você não tiver nenhum script instalado, o menu de scripts não aparecerá.

Instalando scripts do gerenciador de arquivos

O gerenciador de arquivos inclui uma pasta especial em que você pode armazenar seus scripts. Todos os arquivos executáveis nessa pasta aparecerão no menu scripts ("Arquivos → Scripts"). No Nautilus, seu caminho completo é $Home/.gnome2/nautilus-scripts, já no Caja o caminho é $HOME/.config/caja/scripts/ e no nemo é $HOME/.gnome2/nemo-scripts.

Para instalar um script, simplesmente copie-o para esta pasta de scripts e dê a ele a permissão de execução

$ chmod +x  

Para visualizar o conteúdo da sua pasta de scripts, se você já tiver scripts instalados, escolha "Arquivos → Scripts → Abrir Pasta de Scripts".

Aparecerá o seguinte diálogo:

Outra forma de visualizar os scripts será navegando até a pasta de scripts com o gerenciador de arquivos, se você ainda não tiver quaisquer scripts. Pode ser necessário visualizar arquivos ocultos; para isso, utilize "Ver → Exibir Arquivos Ocultos" (até porque se você estiver no seu diretório home (~) sem esta opção ativada, você não verá o diretório .gnome2).

Escrevendo scripts para o gerenciador de arquivos

Quando são executados em uma pasta local, os scripts receberão como entrada os arquivos selecionados. Quando são executados em uma pasta remota (por exemplo, uma pasta mostrando conteúdo web ou de FTP), os scripts não receberão parâmetros.

A tabela a seguir mostra as variáveis que o Nautilus passa, para serem usadas em scripts (as do Caja veremos logo a seguir).

Variável de ambiente Descrição
NAUTILUS_SCRIPT_SELECTED_FILE_PATHS Caminhos para os arquivos selecionados, um por linha (apenas para arquivos locais)
NAUTILUS_SCRIPT_SELECTED_URIS URls para os arquivos selecionados, um por linha
NAUTILUS_SCRIPT_CURRENT_URI URl para a localização atual
NAUTILUS_SCRIPT_WINDOW_GEOMETRY Posição e tamanho da janela atual

Quando executados a partir de uma pasta local, podemos passar para um desses scripts os conteúdos dessas variáveis. Quando executados a partir da seleção de arquivo(s) em um computador remoto isso não acontecerá.

Algumas variáveis do Nautilus podem e devem ser usadas, elas são:

NAUTILUS_SCRIPT_SELECTED_FILE_PATHS São listados os arquivos com caminhos absolutos e com quebra de linha entre eles. Essa é a melhor variável a ser usada, mas ela tem um problema: não funciona em arquivos que estejam na área de trabalho e só funciona em arquivos locais, ou seja, só funciona em rede smb:// se você montar a pasta da rede usando o mount e o smbfs.
NAUTILUS_SCRIPT_SELECTED_URIS A função desta variável é idêntica à anterior, com uma diferença: o caminho gerado é sempre nos formatos file://, smb://, ftp://, http:// etc..., ou seja, ele pode listar qualquer localização no computador, rede ou internet, mas tem um problema crítico: os acentos e espaços são convertidos em códigos, o que impede o seu uso em scripts (nada que não possa ser resolvido por um bom e velho sed filtrando e convertendo para seus valores originais). Mas por que mencioná-lo? Porque ele é a melhor opção para usar com programas que utilizem o gnome-vfs, como o gnome-open, Totem, Rhythmbox, etc.
NAUTILUS_SCRIPT_CURRENT_URI Esta variável contém a pasta atual de execução, equivalente ao comando dirname. Como a primeira variável, essa aqui não funciona na área de trabalho.
NAUTILUS_SCRIPT_WINDOW_GEOMETRY Esta variável informa a posição e tamanho da janela do Nautilus com a qual foi chamado o script. Se você quiser abrir uma janela de diálogo (com o zenity ou o excelente yad, por exemplo), saberá a posição e o tamanho da janela do Nautilus para não sobrepor. A geometria é informada da seguinte maneira: <largura>x<altura>+<desloc_horizontal>+<desloc_vertical>

A tabela a seguir mostra as variáveis que o Caja passa, para serem usadas em scripts:

Nome da variável Finalidade
CAJA_SCRIPT_SELECTED_FILE_PATHS Caminhos delimitados por fim-de-linha para os arquivos selecionados (apenas se locais)
CAJA_SCRIPT_SELECTED_URIS URIs delimitadas por fim-de-linha para os arquivos selecionados
CAJA_SCRIPT_CURRENT_URI URI para a localização atual
CAJA_SCRIPT_WINDOW_GEOMETRY Posição e tamanho da janela atual
CAJA_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS Caminhos delimitados por fim de linha para os arquivos selecionados no painel inativo de uma janela dividida (apenas se locais)
CAJA_SCRIPT_NEXT_PANE_SELECTED_URIS URIs delimitadas por fim-de-linha para os arquivos selecionados no painel inativo de uma janela dividida
CAJA_SCRIPT_NEXT_PANE_CURRENT_URI URI para a localização atual no painel inativo de uma janela dividida

As definições anteriores foram inspiradas no excelente artigo do Lincoln Lordello.

Imagine você que, ao listar a variável $NAUTILUS_SCRIPT_SELECTED_URIS, recebi a seguinte cadeia:

file:///home/julio/%C3%81rea%20de%20Trabalho

então tratei de jogá-la em um filtro com sed:

$ sed 's/%C3%81/Á/g;s/%20/ /g' <<< $NAUTILUS_SCRIPT_SELECTED_URIS
file:///home/julio/Área de Trabalho

Sem me afastar muito do assunto, o filtro de sed que foi usado como exemplo só filtrava Á e espaço em branco, mas se você for usar muito esse tipo de conversão, aconselho a escrever um script com todas as conversões possíveis e, a cada URI que você receber, passar a variável como parâmetro para esse script (fica melhor ainda se esse script for incorporado como uma função externa, sendo executado com o comando source).

Uma coisa que descobri por acaso, mas não vi nenhuma literatura a respeito, é que se você criar diretórios dentro do $HOME/.gnome2/nautilus-scripts e dentro dessa pasta colocar scripts executáveis, esses diretórios também aparecerão no menu (Arquivos → scripts), ajudando a organizar e hierarquizar as suas ferramentas.

Exemplos de scripts

Existem três tipos de scripts que podem ser executados dentro do Nautilus:

1. Com interface gráfica - Esta é a melhor forma de interagir com o Nautilus, além de ser a mais elegante. A melhor forma de fazê-lo é usando zenity (você precisa conhecer bem esta interface do Shell; é muito fácil, simples, elegante e eficiente).

2. Com interface a caractere sem receber dados externos - Também é simples e o Shell sozinho resolve essa parada.

3. Com interface a caractere recebendo dados externos - Essa é de longe a mais chata porque não é óbvia. O problema que surge é em abrir um xterm. Demorei muito e fiz muitas tentativas até conseguir. Mas depois de descoberto o segredo do sucesso, é só seguir a receita do bolo e tudo fica fácil.

Vamos ver alguns exemplos que uso no meu dia a dia:

Com interface gráfica (zenity):

O script a seguir, redimensiona em valores percentuais ou absolutos as imagens dos arquivos selecionados:

$ cat redimen_zen.sh
#!/bin/bash
#  Redimensiona fotos direto no Nautilus
#  Caso o gerenciador de arqs não seja o Nautilus os
#+ nomes das variáveis de sistema deverão ser trocados
IFS=$"\n"           # IFS passa a ser somente o new line
Tipo=$(zenity --list \
    --title "Redimensiona imagens" \
    --text "Informe se redimensionamento\né percentual ou absoluto"\
    --radiolist --column Marque --column "Tipo" \
    true Percentual false Absoluto) || exit 1
if [ $Tipo = Percentual ]
then
    Val=$(zenity --entry \
        --title "Redimensiona imagens" \
        --text "Informe o percentual de redução" \
        --entry-text 50)% || exit 1 # Concatenando % em $Val
else
    Val=$(zenity --entry \
        --title "Redimensiona imagens" \
        --text "Informe a largura final da imagem" \
        --entry-text 200)x || exit 1
fi
Var=$(zenity --list --title "Redimensiona imagens" \
    --text "Escolha uma das opções abaixo" \
    --radiolist --height 215 --width 390 --hide-column 2 \
    --column Marque --column "" --column Opções \
    false 0 "Saída da imagem em outro diretório" \
    false 1 "Saída da imagem com sufixo" \
    true 2 "Saída da imagem sobregravando a inicial") || exit 1
case $Var in
    0) Dir=$(zenity --file-selection \
        --title "Escolha diretório" \
    --directory) || exit 1 ;;
    1) Suf=$(zenity --entry \
        --title "Redimensiona imagens" \
        --text "Informe o sufixo dos arquivos" \
        --entry-text _redim) || exit 1 ;;
    2) mogrify --resize $Val "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
       exit ;;
esac
Arqs=$(echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | wc -l)
#  No for a seguir um echo numérico atualiza
#+ a barra de progresso e um echo seguido de um
#+ jogo-da-velha (#) atualiza o texto do cabeçalho
for Arq in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
    echo $((++i * 100 / $Arqs))
    echo "# Redimensionando $(basename $Arq)"
    sleep 3
    if [ $Var -eq 0 ]
    then
        convert "$Arq" -resize $Val "$Dir/${Arq##*/}"
    else
        convert "$Arq" -resize $Val "${Arq%%.*}$Suf.${Arq#*.}"
    fi
done | zenity --progress \
    --title "Aguarde. Em redimensionamento" \
    --auto-close --auto-kill

Com interface a caractere sem receber dados externos:

O script a seguir altera o usuário do Nautilus para o root.

$ cat naut_root.sh
#!/bin/bash
# Executa uma sessão de Nautilus como root
#+ O gksudo para pegar rapidamente a senha de root
#+ caso o tempo de sudo tenha expirado.
#+ O comando executado pelo gksudo não produz nada .
#+ isso foi feito para o sudo da linha seguinte ganhar
#+ o privilégio de root, sem pedir senha pela
#+ linha de comando, o que complicaria.
gksudo -u root -k -m "Informe sua senha" true
sudo nautilus --no-desktop $NAUTILUS_SCRIPT_CURRENT_URI

Fui informado que existe um bug reportado sobre uma mensagem de warning do Nautilus, somente sob o Ubuntu, mas que aparentemente não influi na execução da tarefa. Provavelmente quando você ler isso o bug já terá sido consertado, mas, de qualquer forma, vou colocar um outro script muito semelhante a este, que é muito útil e está rodando redondinho. Ele abre uma seção do gedit como root, isto é, não é necessário ir para o terminal e executar um:

$ sudo gedit &

Basta, no gerenciador de arquivos clicar no arquivo desejado com a direita, escolher scripts e executar este programa.

$ cat gedit_root.sh
#!/bin/bash
# Executa uma sessão de gedit como root.
#+ O gksudo para pegar rapidamente a senha de root
#+ caso o tempo de sudo tenha expirado.
#+ O comando executado pelo gksudo não produz nada .
#+ isso foi feito para o sudo da linha seguinte ganhar
#+ o privilégio de root, sem pedir senha pela
#+ linha de comando, o que complicaria.
gksudo -u root -k -m "Informe sua senha" true
sudo gedit $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS



Veja a relação completa dos artigos de Julio Cezar Neves