Imagina que tengo un camino que no existe:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Pero digamos /foo/bar que existe. ¿Hay alguna forma rápida de determinar que ese bazes el punto de ruptura en el camino?
Estoy usando Bash

access(2)no es muy granular, así que la solución general implica escribir algo para repetir y probar cada elemento de la ruta a su vez ...Respuestas:
Dado un nombre de ruta canónico, como el suyo, esto funcionará:
Eso imprime a través del último componente completamente existente / accesible de
$pathname, y coloca cada uno de ellos por separado en la matriz arg. El primer componente inexistente no se imprime, pero se guarda en$p.Puede abordarlo de manera opuesta:
Eso volverá adecuadamente o disminuirá
$pathsegún sea necesario. Se niega a intentar un cambio/, pero si tiene éxito, imprimirá tanto su directorio de trabajo actual como el directorio al que cambia a stdout. Su corriente$PWDtambién se incluirá$OLDPWD.fuente
for p in $pathnameestará sujeto a "división de palabras" y "expansión de nombre de ruta".$IFS. así es exactamente como funciona. no está sujeto a la expansión del nombre de ruta, excepto que la variable aquí llamada$pathnamese expande a una matriz de componentes de ruta dividida en$IFS.$pathnamemediante el uso deset -f"que no se devuelve a su valor por defecto.ns, lo que, si se usa aquí, haría que esta discusión fuera discutible.Una de mis utilidades favoritas es
namei, parteutil-linuxy, por lo tanto, generalmente presente solo en Linux:Pero su salida no es muy analizable. Por lo tanto, si solo desea señalar que falta algo,
nameipuede ser útil.Es útil para solucionar problemas generales al acceder a una ruta, ya que puede hacer que indique si un componente es un enlace o un punto de montaje, así como sus permisos:
La capital
Dindica un punto de montaje.fuente
nameifunciona para mí siempre que lo alimente, un camino que existe, pero cuando le doy uno que no, obtengonamei: failed to stat: /usr/share/foo/bar: No such file or directory.Algo así (teniendo en cuenta los nombres de ruta con espacios en blanco incrustados):
fuente
cd not_a_directorytu caparazón solo escribirá para stderr algo asícd:cd:6: no such file or directory: not_a_directory. En realidad, el shell del usuario lo hará en un formato con el que el usuario probablemente ya esté muy familiarizado. Casi siempre es más fácil y mejor al final de todos modos hacer cosas y dejar que el shell maneje los informes según sea necesario. Sin embargo, ese tipo de filosofía requiere una atención muy estricta a los valores de retorno y la promoción / preservación de los mismos.Solo una solución alternativa para bash, suponiendo que la ruta es una ruta absoluta (comienza con /):
fuente
paquepa_prevcomo la primera línea del bucle while (antes de que se incrementa). Cuando la prueba para "pa" falla,pa_prevtiene el último directorio existente en la ruta dada.no es simple, pero puede ponerlo en un script, hacerlo ejecutable y pegarlo en algún lugar de su camino, si lo va a usar con frecuencia.
Advertencia: si el nombre de su directorio en cualquier nivel contiene un
spacecarácter, esto NO funcionará.fuente