Imagine que eu tenho um caminho que não existe:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Mas digamos /foo/bar
que exista. Existe uma maneira rápida de determinar que esse baz
é o ponto de ruptura no caminho?
Estou usando o Bash.
access(2)
não é muito granular, então a solução geralmente envolve escrever algo para iterate e testar cada elemento do caminho, por sua vez ...Respostas:
Dado um nome de caminho canônico, como o seu, isso funcionará:
Isso imprime através do último componente totalmente existente / acessível de
$pathname
e coloca cada um deles separadamente na matriz arg. O primeiro componente inexistente não é impresso, mas é salvo em$p
.Você pode abordá-lo de maneira oposta:
Isso retornará adequadamente ou diminuirá
$path
conforme necessário. Ele se recusa a tentar alterar/
, mas, se for bem-sucedido, imprimirá seu diretório de trabalho atual e o diretório para o qual ele muda para stdout. Sua corrente$PWD
também será inserida$OLDPWD
.fonte
for p in $pathname
estará sujeito a "divisão de palavras" e "expansão do nome do caminho".$IFS
. é exatamente assim que funciona. ela não está sujeita à expansão do nome do caminho, exceto que a variável aqui chamada$pathname
é expandida para uma matriz de componentes do caminho como dividida$IFS
.$pathname
usandoset -f
", que não é devolvido ao seu valor padrão.ns
que, se usado aqui, tornaria essa discussão discutível.Um dos meus utilitários favoritos é
namei
parteutil-linux
e, portanto, geralmente está presente apenas no Linux:Mas sua produção não é muito parseable. Portanto, se você deseja apenas salientar que algo está faltando,
namei
pode ser útil.É útil para solucionar problemas gerais ao acessar um caminho, pois você pode indicar se um componente é um link ou um ponto de montagem, bem como suas permissões:
A capital
D
indica um ponto de montagem.fonte
namei
funciona para mim desde que o alimente, um caminho que existe, mas quando dou um que não recebonamei: failed to stat: /usr/share/foo/bar: No such file or directory
.Algo assim (responsável por nomes de caminho com espaços em branco incorporados):
fonte
cd not_a_directory
seu shell apenas escrever para stderr algo comocd:cd:6: no such file or directory: not_a_directory
. Na verdade, o shell do usuário fará isso em um formato com o qual o usuário provavelmente já esteja muito familiarizado. É quase sempre mais fácil e melhor, no final das contas, fazer as coisas e deixar o shell manipular os relatórios conforme necessário. Esse tipo de filosofia, no entanto, exige uma atenção muito rigorosa para retornar valores e a promoção / preservação dos mesmos.Apenas uma solução alternativa para o bash, assumindo que o caminho é um caminho absoluto (começa com /):
fonte
pa
comopa_prev
como a primeira linha do loop while (antes que seja incrementado). Quando o teste para "pa" falhar,pa_prev
o último diretório existente no caminho especificado.não é simples, mas você pode colocá-lo em um script, torná-lo executável e colá-lo em algum lugar do seu caminho, se você o usar frequentemente.
Advertência: Se o nome do diretório em qualquer nível contiver um
space
caractere, isso NÃO funcionará.fonte