Retirar do diretório excluído

5

Suponha que eu esteja editando alguns arquivos. Eu tenho (digamos) um terminal aberto e um gerenciador de arquivos gui. Eu estou atualmente em /my/very/long/and/winding/directory/path no terminal. No meu gui, eu apago %código% De volta ao terminal, tento /my/very/long/and/winding/directory e recebo um erro, pois o diretório não existe mais. Nada demais. Eu poderia digitar cd .. para voltar para onde quero ir. Mas se eu estiver com preguiça de digitar isso, há uma boa maneira de voltar ao diretório mais próximo que ainda existe?

edit: cd /my/very/long/and/winding é uma solução, neste caso específico. Mas eu estou querendo saber se existe uma resposta mais geral, onde eu não sei quantos passos atrás eu preciso dar.

    
por SauceCode 25.08.2015 / 23:56

3 respostas

3

Assumindo que PWD esteja correto, pode-se voltar ao ZShell dessa forma.

% cd ~/tmp
% mkdir -p a/a/a/a/a/a/a/a/a/a/a
% cd !$
cd a/a/a/a/a/a/a/a/a/a/a
% rm -rf ~/tmp/a
% undir
% pwd
/Users/jmates/tmp
% 

A função undir personalizada faz o loop de retorno da cadeia de caminho:

function undir {
  local dir
  dir=$PWD:h

  while [[ $dir != / ]]; do
    builtin cd -q $dir 2>/dev/null
    if [[ $? -eq 0 ]]; then
      dir=/
    else
      dir=$dir:h
    fi
  done
}

Note que você não pode confiar no comando pwd , pois isso dá resultados diferentes da variável PWD mantida pelo shell:

% mkdir -p a/a/a/a/a/a/a/a/a/a
% cd !$
cd a/a/a/a/a/a/a/a/a/a
% rm -rf ~/tmp/a
% pwd
/Users/jmates/tmp/a/a/a/a/a/a/a/a/a/a
% cd ..
% pwd
.
% echo $PWD
/Users/jmates/tmp/a/a/a/a/a/a/a/a/a
% 

Os shells que não são zsh sem dúvida precisarão de outras soluções.

    
por 26.08.2015 / 00:41
6

Para voltar por um nível de diretório com base no caminho do diretório, em vez do link .. :

cd $PWD:h

Ou o método portátil:

cd "${PWD%/*}"

(aspas opcionais em zsh; aspas opcionais em outros shells se o nome do diretório não contiver espaço em branco ou \[*? )

Repita o :h ou /* quantas vezes desejar para ir mais longe na hierarquia de diretórios.

Como alternativa, digite cd $PWD e pressione Tab para expandir $PWD para seu valor e edite manualmente o resultado. (Dependendo da sua conclusão e das configurações do editor de linhas, talvez seja necessário adicionar / após $PWD antes de pressionar a tecla Tab para pressionar a tecla que você ligou a expand-or-complete (padrão < kbd> Tab ) ou expand-or-complete-prefix ou expand-word (padrão Ctrl + X * ).

    
por 26.08.2015 / 02:53
0

Se você removeu o diretório em que está, o cd .. não funcionará, pois o diretório atual existe sem nome e sem conexão com o resto do mundo. Então, não existe mais.

Todo shell bourne deve permitir escrever uma função que crie uma cópia de $ PWD e percorra o caminho até onde ele ainda existe.

    
por 26.08.2015 / 11:50