Linux / Comando cd: mudar de diretório no Bash

cd muda o diretório de trabalho atual do shell no Linux. Use um caminho absoluto ou relativo, cd sem argumentos para ir ao diretório indicado por HOME e cd - para voltar ao local guardado em OLDPWD. Os exemplos deste artigo usam Bash.

O diretório de trabalho atual é a base usada para interpretar caminhos relativos. Como cd precisa mudar esse estado no próprio shell, é um comando interno. A navegação por links simbólicos e CDPATH, uma lista de locais de busca, exige alguns cuidados para que scripts trabalhem na pasta esperada.

O que é o comando cd?

cd significa 'change directory' (mudar diretório) e altera o diretório de trabalho atual do shell. Comandos executados posteriormente com caminhos relativos procuram arquivos e diretórios com base no diretório alterado.

Use pwd para conferir o diretório antes e depois da mudança. O caminho /var/log é um exemplo comum de Linux; deve existir e ser acessível. Veja também a referência de comandos Linux para outras ferramentas de inspeção.

pwd
cd /var/log
pwd

type cd identifica o comando interno do Bash, salvo se o nome tiver sido redefinido. Um processo separado pode mudar o seu próprio diretório, mas não o do shell que o iniciou; por isso executar um programa externo não substitui a ação do comando interno no pai. O guia de type ajuda a verificar funções e outras redefinições.

Sintaxe básica

cd [-L] [-@] [diretório]
cd -P [-e] [-@] [diretório]

A sinopse usa colchetes para partes opcionais; não os digite literalmente. Na maioria dos casos, basta o caminho. Nos exemplos de caminhos abaixo, escolha a linha adequada à sua pasta atual e substitua diretórios que não existam. Cada cd relativo usa o local deixado pela mudança anterior: as linhas não são uma receita para criar a estrutura de pastas.

cd /etc
cd projects

Se o movimento for bem-sucedido, ele retorna um status de saída 0, e se o caminho não existir ou não houver permissões suficientes, ele retorna um valor diferente de zero. Em scripts onde o sucesso é importante, você deve verificar o status de saída.

Usar caminhos absolutos e relativos

Caminhos absolutos

Um caminho absoluto começando a partir do diretório raiz / aponta para o mesmo destino independentemente da localização atual.

cd /var/log
cd /usr/local/bin
cd /

Caminhos absolutos são mais fáceis de entender se a localização base precisar ficar clara em procedimentos operacionais ou scripts.

Caminhos relativos

Caminhos relativos são interpretados com base no diretório de trabalho atual.

cd documents
cd projects/web
cd ../backup

Os exemplos relativos são alternativas, não etapas independentes do local atual: depois de cd documents, cd projects/web procuraria projects/web dentro de documents. Execute a alternativa desejada a partir de uma base conhecida e confirme com pwd. Os caminhos podem conter mais de um componente; ../backup procura backup no nível acima.

Ir ao diretório pessoal, ao pai e ao anterior

Diretório pessoal

Sem argumentos, cd usa HOME. Com cd ~, o Bash expande primeiro o til não citado; normalmente chega ao mesmo diretório. Há uma diferença quando HOME não está definida: cd falha, enquanto ~ pode usar o diretório cadastrado para o usuário. ~/Downloads só funciona se essa pasta existir e for acessível.

cd
cd ~
cd ~/Downloads

O diretório pessoal de outro usuário pode ser referenciado com um til seguido do nome cadastrado, como ~alice. alice é apenas um exemplo; use uma conta existente e não coloque o til entre aspas se quiser a expansão.

cd ~alice

A expansão não concede acesso ao diretório. Se o nome da conta for inválido, o Bash deixa o prefixo ~alice sem expandir; ele pode acabar sendo tratado como um nome literal. Confira a conta e o caminho, além das permissões.

Diretório atual e diretório pai

Um único ponto . representa o diretório atual, e dois pontos .. representam o diretório pai.

cd .
cd ..
cd ../..
cd ../../shared

cd ., com espaço entre o comando e o ponto, normalmente mantém a localização. Cada componente .. sobe um nível; cd ../.. sobe dois. As linhas acima mostram alternativas: se executadas em sequência, cada uma parte do diretório deixado pela anterior. ... não é um atalho padrão do Bash para subir dois níveis.

Voltar ao diretório anterior com cd -

cd - move para o diretório de trabalho anterior armazenado em OLDPWD e, se bem-sucedido, exibe o novo caminho.

cd /etc
cd /var/log
cd -

É conveniente ao alternar entre dois diretórios. Se a informação do diretório anterior ainda não foi criada no shell atual, pode ocorrer um erro OLDPWD not set.

Caminhos com espaços e caracteres especiais

Colocar caminhos entre aspas

Caminhos com espaços devem ser colocados entre aspas para que sejam passados como um único argumento.

cd "Project Files"
cd '/srv/shared data'

Aspas duplas também impedem a divisão em palavras e a expansão de curingas quando o caminho vem de uma variável. No exemplo seguinte, target contém um caminho absoluto ilustrativo; substitua-o por uma pasta existente. -- encerra as opções, mas o argumento isolado - continua significando OLDPWD; para uma pasta cujo nome seja apenas um hífen, use ./-.

target='/srv/shared data'
cd -- "$target"

Barras invertidas e nomes que parecem opções

Você também pode escapar espaços colocando uma barra invertida na frente deles.

cd Project\ Files

Para um nome como -archive, use ./ ou --. As duas linhas abaixo são alternativas a partir da pasta que contém -archive; se executar a segunda depois da primeira sem voltar, ela procurará outra pasta -archive dentro da atual.

cd ./-archive
cd -- -archive

Usar a conclusão automática com tab permite que o shell escape corretamente espaços e caracteres especiais em caminhos, reduzindo erros de digitação.

Entender PWD e OLDPWD

PWD: localização atual

O Bash armazena o novo diretório de trabalho na variável PWD após uma movimentação bem-sucedida. Você pode compará-lo com o comando pwd para verificar o caminho lógico lembrado pelo shell atual.

printf '%s\n' "$PWD"
pwd

~+ também é substituído pelo valor de PWD na expansão de til do Bash.

printf '%s\n' ~+

OLDPWD: localização anterior

Após uma movimentação bem-sucedida, o diretório de trabalho anterior é armazenado em OLDPWD. cd - utiliza esse valor.

printf '%s\n' "$OLDPWD"
printf '%s\n' ~-

OLDPWD pode não existir no início da sessão. Se estiver ausente, cd - falha e a expansão ~- permanece literal. Não atribua valores arbitrários a PWD e OLDPWD para tentar mudar de pasta: a mudança real deve ser feita com cd.

Links simbólicos e as opções -L, -P

Em caminhos que contêm links simbólicos, o caminho lógico lembrado pelo shell pode diferir do caminho físico resolvido pelo sistema de arquivos.

Preservar caminhos lógicos com -L

-L pede navegação lógica e resolve componentes .. antes de seguir os links. É o padrão normal do Bash, mas uma configuração como set -P muda a navegação sem opção explícita. Ao entrar por um link, PWD pode conservar o nome do link. /srv/current pressupõe um link existente para um diretório acessível; substitua-o pelo seu caminho.

cd -L /srv/current
pwd

Ele preserva a estrutura do caminho inserido pelo usuário, facilitando a compreensão ao trabalhar com links de projeto ou o link da versão atual.

Seguir caminhos físicos com -P

-P interpreta links simbólicos como seus caminhos físicos durante a navegação. É usado quando você precisa verificar a localização real no sistema de arquivos ou processar .. com base no destino do link.

cd -P /srv/current
pwd -P

Com -P, -e retorna falha se o Bash não conseguir determinar o caminho físico depois de mudar de diretório. Isso não é uma operação com reversão automática: a mudança pode já ter ocorrido quando a apuração do caminho falha. Confira o status e o contexto antes de continuar a tarefa.

cd -P -e /srv/current

Buscar diretórios com CDPATH

CDPATH contém diretórios separados por dois-pontos para a busca de caminhos relativos por cd. No Bash, um caminho absoluto ou um caminho cujo primeiro componente seja . ou .. não usa essa busca. Um caminho relativo como projetos/web pode ser afetado. Isso é diferente de PATH, usado para localizar programas.

Exemplo de configuração do CDPATH

(
  CDPATH=.:~/projects:/srv/apps
  export CDPATH
  cd sample-app
)

O bloco procura sample-app nas entradas indicadas. Ele exige que pelo menos um desses diretórios contenha a pasta; ajuste os exemplos ao seu sistema. Na atribuição do Bash, ~/projects é expandido a partir do diretório pessoal. Os parênteses limitam a configuração e a mudança ao subshell, preservando CDPATH e a localização do chamador. export só é necessário se a variável também precisar ser transmitida a novos processos.

Cuidados ao usar CDPATH

Se a busca usa uma entrada não vazia de CDPATH e tem sucesso, Bash imprime o novo caminho absoluto. A entrada . também é não vazia e pode produzir essa saída. Uma entrada vazia representa o diretório atual sem essa impressão adicional; sua posição na lista determina a prioridade da busca.

Em scripts, um prefixo explícito ./ evita essa busca. Na linha abaixo, ./build deve existir na pasta atual. CDPATH= também fornece um valor vazio temporário ao comando interno: a mudança de diretório afeta o shell atual, mas o valor anterior de CDPATH é restaurado depois no Bash padrão.

CDPATH= cd -- ./build

Executar a tarefa somente se cd funcionar

Uma operação deve rodar somente se a mudança para a pasta de trabalho tiver sucesso. Para experimentar sem implantar nada, substitua /srv/app no bloco abaixo por uma pasta de teste existente, gravável e cujo nome você conheça. O bloco cria um task.sh completo que apenas mostra o diretório; não usa privilégios nem altera uma aplicação. noclobber impede sobrescrever um arquivo regular já existente, e falhas encerram o subshell.

(
  set -o noclobber
  cd /srv/app && {
    cat > task.sh <<'EOF' || exit 1
#!/usr/bin/env bash
printf 'Diretório=%s\n' "$PWD"
EOF
    chmod u+x task.sh || exit 1
    ./task.sh
  }
)

Se a pasta existir, o bloco mostra Diretório=... com o caminho escolhido; se cd falhar, o grupo à direita de && não roda. O arquivo criado fica disponível para os próximos exemplos e o shell chamador mantém seu diretório. Para uma versão de várias linhas, salve o próximo bloco em run-task.sh e execute bash run-task.sh, com o mesmo caminho ajustado. Como há exit, trate-o como um script executado separadamente, sem o carregar com source.

cd /srv/app || {
  printf '%s\n' 'Não foi possível entrar no diretório de trabalho.' >&2
  exit 1
}

./task.sh

Usar apenas cd caminho; comando executa a segunda operação mesmo se a mudança falhar. && e o tratamento de erro acima preservam essa dependência. Em uma rotina real, substitua o script de demonstração somente por uma tarefa existente e revisada.

Usar cd em scripts e subshells

Por que um script não pode alterar a localização do shell pai

Para reproduzir a diferença entre executar e carregar um script, use o exemplo completo abaixo em uma pasta de teste que ainda não contenha change-directory.sh. Ele cria um arquivo que muda para o diretório pessoal e mostra o destino. Bash, cat e chmod devem estar disponíveis. O grupo impede a sobrescrita de um arquivo regular existente e prepara o exemplo sem carregar configurações pessoais do shell.

(
  set -o noclobber
  cat > change-directory.sh <<'EOF' || exit 1
#!/usr/bin/env bash
cd -- "$HOME" || exit 1
printf 'Diretório do script=%s\n' "$PWD"
EOF
  chmod u+x change-directory.sh || exit 1
  ./change-directory.sh
)
pwd

A mensagem do script mostra o diretório pessoal; o pwd depois do grupo mostra que o shell chamador continuou onde estava. O arquivo permanece na pasta. Já a linha seguinte carrega esse mesmo arquivo com source e muda a localização do próprio shell. Faça o teste em um shell de experiência, confira com pwd e use cd - para voltar, se OLDPWD estiver disponível. Um arquivo carregado pode alterar variáveis, opções e até encerrar a sessão; leia seu conteúdo antes.

source ./change-directory.sh

Manter o diretório do chamador com um subshell

O bloco seguinte reutiliza o task.sh preparado na pasta de teste. Ajuste o mesmo caminho de /srv/app: o script só roda se cd tiver sucesso. Os parênteses fazem a navegação ocorrer em um subshell, sem mudar o diretório do chamador.

(
  cd /srv/app && ./task.sh
)

Ao sair do subshell, a localização do chamador continua a mesma. Para visitar várias pastas na própria sessão, pushd adiciona locais à pilha de diretórios e popd, sem argumentos, remove o topo e muda para o novo topo. dirs mostra a pilha, cujo primeiro elemento é o diretório atual; opções como popd -n podem manipular a pilha sem mudar de pasta.

Por que sudo cd não muda o shell atual

sudo cd /root geralmente não pode ser usado. cd é um comando interno do shell atual, e um processo iniciado por sudo não pode mudar o diretório de trabalho do shell pai.

Quando um shell administrativo for realmente necessário e autorizado pela política local, sudo -i inicia um shell de login do usuário de destino, normalmente root quando nenhum usuário é especificado. Isso cria outro shell; não transforma o diretório do shell anterior. Termine-o com exit ao concluir. A documentação de opções mantida pelo projeto sudo descreve -i como a opção de login.

sudo -i

As duas linhas seguintes são alternativas para um script administrativo real chamado maintenance.sh, já existente, revisado e protegido contra alterações indevidas. Não são necessárias para os testes de navegação deste artigo. Na primeira, o usuário atual precisa conseguir entrar na pasta antes de executar sudo; na segunda, a mudança acontece no shell iniciado por sudo, conforme a autorização da política.

cd /srv/app && sudo ./maintenance.sh
sudo sh -c 'cd /srv/app && ./maintenance.sh'

Use privilégios de administrador apenas quando necessário e assegure-se de que os caminhos e executáveis sejam confiáveis.

Comparar cd, pushd, popd e dirs

Comando Uso principal Recursos
cd Move-se para o diretório especificado. Você pode retornar ao local anterior usando OLDPWD.
pushd Move enquanto salva a localização atual na pilha de diretórios. Útil ao se mover entre múltiplas localizações, e o Bash gerencia a pilha.
popd Sem argumentos, remove o topo da pilha e muda para o novo topo. Emparelha com pushd para restaurar a localização salva.
dirs Verifica a pilha de diretórios atual. Você pode exibir apenas o estado da pilha sem se mover.

Comandos de navegação úteis

Comando Descrição
cd Mover para o diretório pessoal do usuário atual.
cd ~ Mover para o diretório pessoal usando expansão de til.
cd .. Mover para o diretório pai.
cd ../.. Mover para o diretório dois níveis acima.
cd - Voltar para o diretório de trabalho anterior.
cd / Mover para o diretório raiz do sistema de arquivos.
cd ~/projects Mover para o diretório projects dentro do diretório home.
cd -P caminho Move seguindo o caminho físico resolvido a partir de links simbólicos.

Resumo de opções

Opção Descrição
-L Pede navegação lógica; é o padrão normal, salvo configurações como set -P.
-P Interpreta links simbólicos como o caminho físico do destino e se move até lá.
-e Com -P, falha se não puder obter o caminho físico após a mudança; isso não garante reversão da navegação.
-@ Em sistemas suportados, exibe os atributos estendidos dos arquivos como se fossem diretórios. Isso pode não ser suportado em ambientes Linux típicos.
-- Encerra as opções. Um argumento isolado - ainda significa OLDPWD; para o nome literal, use ./-.

Erros comuns

No such file or directory

Confirme a pasta de partida com pwd e substitua caminho de destino abaixo por um caminho real, mantendo as aspas se houver espaços. Verifique cada componente, diferenças de maiúsculas e minúsculas, espaços e links quebrados. Uma falha comum de cd deixa a pasta anterior ativa, por isso não execute a tarefa seguinte sem conferir o status.

pwd
ls -ld -- "caminho de destino"

Permission denied

No Linux, a navegação requer permissão de pesquisa em cada diretório do caminho, representada por x. Isso é diferente de r, usado para listar nomes. A linha abaixo pressupõe que namei esteja instalado; substitua /path/to/directory pelo caminho investigado.

namei -l /path/to/directory

Confirme se o usuário deve ter acesso e se a solução correta envolve seu grupo, uma lista de controle de acesso (ACL) ou outra política do sistema. Não conclua que uma permissão básica isolada descreve toda a decisão de acesso.

Not a directory

Um componente intermediário ou final pode ser um arquivo regular, e não um diretório; também pode ser um link cujo destino não seja uma pasta. Substitua o campo ilustrativo e use file e ls -ld para inspecionar o tipo. O guia de ls explica a listagem da própria entrada com -d.

file -- "caminho de destino"
ls -ld -- "caminho de destino"

Perguntas frequentes

É normal não haver saída ao executar o comando cd?

Sim, isso é normal. Um cd bem-sucedido para um caminho normal não produz saída. Você pode verificar sua localização atual com pwd, e os caminhos encontrados usando cd - ou CDPATH podem imprimir o novo caminho em caso de sucesso.

Como faço para subir dois níveis para o diretório pai?

Use cd ../.., com um espaço depois de cd e uma barra entre os dois componentes ... Cada componente representa um nível acima no modo de navegação escolhido.

Posso mudar o diretório do terminal atual usando um script?

Um script executado como processo separado não muda o diretório do shell chamador. Uma função executada no shell atual ou source pode fazê-lo. Essas formas também podem alterar outros estados da sessão, portanto use somente código conhecido e revisado.

Documentação oficial