Se você, como eu, está sempre em busca de facilidades para reduzir o esforço na linha de comandos, então esta dica lhe será muito útil para navegação em estruturas de diretórios muito grandes.
Eu já uso estas funções há alguns anos e garanto que o ganho na sua produtividade será imenso sem que isso altere sua rotina de trabalho.
A vantagem da implementação na forma de funções shellscript é que assim elas podem ser facilmente adicionadas ao “~/.bashrc” ou qualquer outro arquivo de inicialização do seu terminal e você já poderá sair usando sem dificuldades.
Função para navegar através do histórico de pastas recentes
Imagine que você acessa determinados diretórios com bastante frequência e que por terem um caminho muito longo você sempre esquece os endereços.
Por exemplo. Imagine que ao menos uma ou duas vezes, todos os dias, você acesse o endereço “/var/www/intranet/publicacoes/relatorios/publicos”.
Digitar este caminho todas as vezes não é muito produtivo, é!? Vamos começara melhor isso então. Abra o seu terminal e digite ou cole o código a seguir:
# Acessa diretórios recentes usando REGEX # Welington R. Braga (2019) # -l exibe o path completo do diretório, ao invés de acessá-lo de fato # Depende da função "cd" personalizada cd-r() { FOLDER="$1" if [ "$1" == "-l" ]; then FOLDER="$2"; fi REALPATH=$(awk '/'${FOLDER/\//\\/}'$/ { last=$0 } END { if (last == "") { print "Diretorio ['${FOLDER}'] nao identificado"; } else { print last; } }' ~/.cd.history ) if [ "$1" == "-l" ]; then echo "${REALPATH}"; else cd "${REALPATH}"; fi }
A sua finalidade é identificar os diretórios que já acessamos através do registro no arquivo .cd.history, que será criado no seu HOME. Mas como este arquivo não é criado e nem atualizado por esta função, ela ainda não funciona sem o complemento a seguir.
Função cd modificada
A função acima é complementada com essa aqui. Uma sobreposição da função “cd” original do bash, que acrescenta mais simplicidade a função original e também “dá vida” a função “cd-r” que vimos antes.
# Melhora a função cd # Welington R. Braga (2019) # Acrescenta um log de acessos e retorno de níveis infinitos até a raiz cd() { if [[ "$1" =~ ^.{1,}$ ]]; then LASTPWD="${PWD}" for (( i=0; i<$(( ${#1} - 1 )); i++ )); do builtin cd .. done OLDPWD="${LASTPWD}" elif [[ "$1" =~ ^\?.*$ ]]; then NEWPWD="$1" cd-r ${NEWPWD:2} else builtin cd "$@" fi echo $PWD >>~/.cd.history }
Navegando nos diretórios com as novas ferramentas
Você não mudará muito a sua rotina de trabalho. O uso do cd permanece normal para aquilo que você já fazia antes Por exemplo:
Acessar o seu diretório HOME e; em seguida, o diretório com os arquivos de cache do apt:
cd ~ cd /var/cache/apt/archives
As diferenças começam a partir daqui. Digamos que você queira voltar ao diretório “cache”… se eu dissesse para voltar ao diretório “apt” você certamente voltaria com “cd ..” mas para voltar até o “cache” isso não é possível, ou melhor, não era.
Com a mudança que fizemos, você pode usar tantos “.” (ponto) quanto necessário para voltar cada nível da estrutura. Então para subir até o “cache” eu usaria o seguinte comando:
cd ...
Não existia no “cd” original a opção de usar “três pontos”, agora existe. Isso é muito mais prático e rápido do que digitar “cd /var/cache” ou então “cd ../..”
E não para por ai. A quantidade pontos a serem usadas é limitada apenas ao número de saltos até a raiz. Por exemplo, suponhamos que eu acessei o diretório “publicos”, abaixo, e depois de alguma atividade eu quero voltar até “intranet”, da mesma estrutura. Como eu quero subir 4 níveis basta usar 4 pontos.
cd /var/www/intranet/publicacoes/relatorios/publicos cd ....
Agora você pode voltar a o seu home como normalmente faz:
cd ~
Perceba que o “cd” continua funcionando normalmente, mas ainda há mais uma novidade. Digamos que você precise retornar ao diretório archive.
Ao invés de digitar todo o caminho novamente, você fará assim:
cd ?archives
Pronto, você está de volta ao diretório “/var/cache/apt/archives” sem ter digitado todo o caminho. Muito mais simples, não!?
Se quiser retornar ao diretório “publicos” faria a mesma coisa:
cd ?publicos
Fazendo tudo funcionar “pra sempre”
Nós apenas digitamos as funções no terminal e as usamos nesta sessão. Se você abrir outra sessão de terminal estas funções não estarão mais disponíveis. Para que isso seja possível você deverá salvar tudo no seu arquivo de inicialização do Bash que normalmente é o ~/.bashrc.
Usando então um editor de sua preferência, abra este arquivo, cole o código das funções no final do código que já existe lá, salve e feche-o. A partir daqui as funções estarão disponíveis em todas as suas sessões.
Limitações
Nem tudo são flores e funciona muito bem. Do jeito que estão elas tem me atendido há alguns anos, mas eu já me conformei com alguns bugs que não são críticos mas fariam alguém dizer que elas não são profissionais, ou bugadas; a própria construção das funções poderia ter ser simplificado em uma só, mas enfim, isso fica para um futuro quando estiver disponível, ou se você, nobre leitor, estiver disposto, faça suas alterações e compartilhe, certamente será muito bem-vindas.