Linux Kamarada

Nautilus/Arquivos: como adicionar funcionalidades e automatizar tarefas do dia-a-dia com scripts personalizados

O Nautilus (o gerenciador de arquivos padrão do ambiente GNOME, também conhecido como Arquivos) possui um recurso pouco conhecido, mas extremamente útil: a possibilidade de adicionar scripts personalizados ao menu de contexto. Com eles, é possível transformar tarefas repetitivas – como abrir uma pasta em um editor de código, compactar arquivos, renomear em lote, enviar arquivos para outro programa, converter formatos, entre tantas outras – em um simples clique com o botão direito do mouse.

Na prática, qualquer executável (um script shell, Python, Perl etc.) colocado em uma pasta específica do sistema passa a aparecer automaticamente no submenu Scripts do menu de contexto do Nautilus, recebendo informações sobre os arquivos ou pastas selecionados por meio de variáveis de ambiente. Isso permite estender a funcionalidade do gerenciador de arquivos sem precisar escrever uma extensão completa (em C ou Python, usando a API oficial do Nautilus), bastando conhecimentos básicos de shell script.

Tomei conhecimento dessa funcionalidade quando o Claude Desktop criou os scripts Abrir no Claude Code e Enviar para o Claude na devida pasta e essas opções passaram a aparecer para mim no menu de contexto do Nautilus. Isso me levou a investigar como esse mecanismo funcionava e, a partir daí, a escrever meus próprios scripts.

Desde quando o Nautilus suporta scripts?

Esse recurso é bem antigo. Ele existe desde as primeiras versões do Nautilus, no início dos anos 2000. Na época, a pasta de scripts era ~/.gnome2/nautilus-scripts. Com a adoção do padrão de diretórios XDG Base Directory, o caminho migrou para o local atual, ~/.local/share/nautilus/scripts, mudança feita no código do Nautilus por volta de 2010, visando o GNOME 3.0. O mecanismo em si – qualquer executável nessa pasta aparece automaticamente no submenu Scripts – permanece praticamente inalterado até as versões atuais do Nautilus.

O que é preciso saber para escrever um script desses

Não é necessário conhecimento avançado de programação para criar um script do Nautilus. O essencial é:

  1. Localização da pasta: o script deve ser salvo em ~/.local/share/nautilus/scripts/. Subpastas dentro desse diretório também são suportadas e aparecem como submenus.
  2. Variáveis de ambiente: o Nautilus não passa argumentos de linha de comando tradicionais — em vez disso, exporta variáveis de ambiente com informações sobre a seleção atual. As principais são:
    • NAUTILUS_SCRIPT_SELECTED_FILE_PATHS — caminhos absolutos dos arquivos/pastas selecionados (um por linha), apenas para itens locais.
    • NAUTILUS_SCRIPT_SELECTED_URIS — URIs dos itens selecionados (um por linha), incluindo itens remotos (por exemplo, sftp://).
    • NAUTILUS_SCRIPT_CURRENT_URI — URI da pasta atualmente aberta no Nautilus.
    • NAUTILUS_SCRIPT_WINDOW_GEOMETRY — posição e tamanho da janela do Nautilus.
  3. Shebang e permissão de execução: como qualquer script Unix, é preciso declarar o interpretador na primeira linha (#!/bin/sh, #!/usr/bin/env python3, etc.) e marcar o arquivo como executável (chmod +x).
  4. Cuidado com múltiplas seleções e caminhos remotos: um script robusto deve tratar o caso de nenhuma seleção, seleção múltipla e URIs não locais, evitando comportamentos inesperados.

Exemplo de script: Abrir no VS Code

Como exemplo, segue o script que criei para abrir a pasta selecionada (ou a pasta atual, se nada estiver selecionado) diretamente no VS Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/sh
# Bail out silently if the VS Code CLI isn't installed.
[ -x '/usr/bin/code' ] || exit 0

nl='
'
# Nautilus passes multiple selected items separated by newlines in
# NAUTILUS_SCRIPT_SELECTED_URIS/FILE_PATHS. We only support a single
# selected folder, so if more than one item is selected ($nl followed by
# another char), treat the selection as empty and fall back below.
case "$NAUTILUS_SCRIPT_SELECTED_URIS" in *"$nl"?*) sel="" ;; *) sel="${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS%"$nl"}" ;; esac

# If exactly one folder is selected, use it; otherwise fall back to the
# folder currently open in Nautilus (only when it's a local path).
if [ -n "$sel" ] && [ -d "$sel" ]; then
  dir="$sel"
else
  case "$NAUTILUS_SCRIPT_CURRENT_URI" in
    file://*) dir="$PWD" ;;
    *) exit 0 ;; # not a local folder (e.g. network location), nothing to open
  esac
fi

# Safety check: make sure we ended up with an absolute path before using it.
case "$dir" in
  /*) ;;
  *) exit 0 ;;
esac

# Replace this script process with VS Code, opening the target folder.
exec '/usr/bin/code' "$dir"

Esse script faz, em resumo:

  • Verifica se o executável do VS Code (/usr/bin/code) existe; caso contrário, encerra sem fazer nada.
  • Determina se há exatamente uma pasta selecionada no Nautilus; se não houver, usa a pasta atualmente aberta (desde que seja um caminho local).
  • Valida que o caminho encontrado é absoluto, por segurança.
  • Substitui o processo do script pelo processo do VS Code (exec), abrindo a pasta desejada.

Basta salvar esse conteúdo em um arquivo chamado Abrir no VS Code dentro de ~/.local/share/nautilus/scripts/, dar permissão de execução (chmod +x "Abrir no VS Code") e a opção passa a aparecer no menu de contexto ao clicar com o botão direito em uma pasta.

Mais um exemplo: Organizar fotos

No meu blog pessoal, compartilhei um script em Python que fiz com ajuda do GitHub Copilot para organizar fotos em pastas por data. Agora me ocorreu: e se eu usasse o conhecimento que acabei de adquirir para integrar aquele script ao Nautilus?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh
# Bail out silently if the organizar-fotos script or GNOME Console isn't installed.
[ -x "$HOME/bin/organizar-fotos" ] || exit 0
[ -x '/usr/bin/kgx' ] || exit 0

nl='
'
# Nautilus passes multiple selected items separated by newlines in
# NAUTILUS_SCRIPT_SELECTED_URIS/FILE_PATHS. We only support a single
# selected folder, so if more than one item is selected ($nl followed by
# another char), treat the selection as empty and fall back below.
case "$NAUTILUS_SCRIPT_SELECTED_URIS" in *"$nl"?*) sel="" ;; *) sel="${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS%"$nl"}" ;; esac

# If exactly one folder is selected, use it; otherwise fall back to the
# folder currently open in Nautilus (only when it's a local path).
if [ -n "$sel" ] && [ -d "$sel" ]; then
  dir="$sel"
else
  case "$NAUTILUS_SCRIPT_CURRENT_URI" in
    file://*) dir="$PWD" ;;
    *) exit 0 ;; # not a local folder (e.g. network location), nothing to open
  esac
fi

# Safety check: make sure we ended up with an absolute path before using it.
case "$dir" in
  /*) ;;
  *) exit 0 ;;
esac

# Open a new GNOME Console window running organizar-fotos on the target
# folder. Unlike xterm's "-hold", kgx has no built-in flag to keep the
# window open after the command finishes, so we wrap it in a shell that
# waits for a keypress at the end, letting the user read the output.
exec /usr/bin/kgx --working-directory="$dir" -- sh -c '
  "$1"/organizar-fotos "$2"
  printf "\n[Pressione Enter para fechar...]"
  read _ignore
' sh "$HOME/bin" "$dir"

Onde encontrar mais informações

Caso você queira ler mais sobre os scripts do Nautilus, uma vez que o Projeto GNOME não mantém uma página oficial e atualizada sobre esse recurso, as referências mais confiáveis disponíveis atualmente são:

Além dessas, o próprio código-fonte do Nautilus, disponível no GitLab do Projeto GNOME, é a fonte mais autoritativa para quem quiser entender exatamente quais variáveis de ambiente são exportadas e como o submenu Scripts é construído internamente.

Me paga um café?
Se você gostou muito, se foi muito útil pra você, será que vale um café? Se quiser, você pode "me pagar um café" pelo PayPal ou contribuir com o projeto de outras formas.

Comentários

Sobre

O Projeto Linux Kamarada visa divulgar e promover o Linux como um sistema operacional robusto, seguro, versátil e fácil de usar, adequado para o uso diário seja em casa, no trabalho ou no servidor. Os focos do projeto são principalmente distribuição e documentação.

Anúncios

Facebook

Autor