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.




