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 é:
- 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. - 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.
- 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). - 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:
- Nautilus scripts - Ubuntu Wiki
- Integrating scripts in Nautilus to perform useful tasks - Fedora Magazine
- How to extend the GNOME Nautilus file manager with custom scripts - LinuxConfig.org
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.