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 baz
es 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á
$path
segú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$PWD
también se incluirá$OLDPWD
.fuente
for p in $pathname
estará 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$pathname
se expande a una matriz de componentes de ruta dividida en$IFS
.$pathname
mediante 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-linux
y, 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,
namei
puede 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
D
indica un punto de montaje.fuente
namei
funciona 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_directory
tu 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
pa
quepa_prev
como la primera línea del bucle while (antes de que se incrementa). Cuando la prueba para "pa" falla,pa_prev
tiene 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
space
carácter, esto NO funcionará.fuente