Digamos que tengo dos caminos: <source_path>
y <target_path>
. Me gustaría que mi concha (zsh) para encontrar automáticamente si hay una manera de representar <target_path>
de <source_path>
una ruta relativa.
Por ejemplo, supongamos
<source_path>
es/foo/bar/something
<target_path>
es/foo/hello/world
El resultado sería ../../hello/world
Por qué necesito esto:
Yo necesito como para crear un enlace simbólico desde <source_path>
que <target_path>
el uso de un pariente enlace simbólico siempre que sea posible, ya que de lo contrario nuestro servidor Samba no muestra el archivo correctamente cuando accedo a estos archivos en la red desde Windows (no soy el administrador del sistema, y don' tener control sobre esta configuración)
Suponiendo que <target_path>
y <source_path>
son rutas absolutas, lo siguiente crea un enlace simbólico que apunta a una ruta absoluta .
ln -s <target_path> <source_path>
entonces no funciona para mis necesidades. Necesito hacer esto para cientos de archivos, por lo que no puedo solucionarlo manualmente.
¿Algún shell incorporado que se encargue de esto?
symlinks
para convertir enlaces absolutos a relativos.Respuestas:
Puede usar el
symlinks
comando para convertir rutas absolutas a relativas:Tenemos enlaces absolutos, convirtámoslos a relativos:
Referencias
fuente
Intente usar el
realpath
comando (parte de GNUcoreutils
; > = 8.23 ), por ejemplo:Si está utilizando macOS, instale la versión de GNU a través de:
brew install coreutils
y úselagrealpath
.Tenga en cuenta que ambas rutas deben existir para que el comando sea exitoso. Si necesita la ruta relativa de todos modos, incluso si uno de ellos no existe, agregue el modificador -m.
Para obtener más ejemplos, consulte Convertir ruta absoluta en ruta relativa dado un directorio actual .
fuente
realpath: unrecognized option '--relative-to=.'
:( realpath versión 1.19realpath
. Si estás en MacOS, instalar a través de:brew install coreutils
.realpath (GNU coreutils) 8.26
donde el parámetro está presente. Consulte: gnu.org/software/coreutils/realpath. Verifique que no esté utilizando un alias (por ejemplo, ejecutar como\realpath
) y cómo puede instalar la versión desdecoreutils
.Creo que también vale la pena mencionar esta solución de Python (tomada de la misma publicación que la respuesta de @ EvanTeitelman). Agregue esto a su
~/.zshrc
:Luego puede hacer, por ejemplo:
fuente
sys.argv
. Si el código publicado es incorrecto o puede mejorarse, no dude en hacerlo con mi agradecimiento.No hay ningún cascarón incorporado para encargarse de esto. Sin embargo, encontré una solución en Stack Overflow . Copié la solución aquí con ligeras modificaciones y marqué esta respuesta como wiki de la comunidad.
Puede usar esta función así:
fuente
Esta es la solución más simple y hermosa para el problema.
También debería funcionar en todos los depósitos tipo bourne.
Y la sabiduría aquí es: no hay absolutamente ninguna necesidad de utilidades externas o incluso condiciones complicadas. Un par de sustituciones de prefijos / sufijos y un bucle while es todo lo que necesita para hacer casi cualquier cosa en conchas tipo bourne.
También disponible a través de PasteBin: http://pastebin.com/CtTfvime
fuente
Makefile
, necesitaba agregar un par de comillas dobles a la líneapos=${pos%/*}
(y, por supuesto, punto y coma y barras diagonales al final de cada línea).relpath /tmp /tmp
,relpath /tmp /tmp/a
,relpath /tmp/a /
. Además, olvida mencionar que todos los caminos deben ser absolutos Y canonicalizados (es decir/tmp/a/..
, no funciona)Tuve que escribir un script bash para hacer esto de manera confiable (y, por supuesto, sin verificar la existencia del archivo).
Uso
Devuelve una ruta de origen relativa.
ejemplo:
ambos consiguen
../../CC/DD/EE
Para tener una prueba rápida puedes correr
resultado: una lista de prueba
Por cierto, si desea utilizar este script sin guardarlo y confía en este script, entonces tiene dos formas de hacerlo con bash trick.
Importar
relpath
como una función bash siguiendo el comando. (Requiere bash 4+)o llame al script sobre la marcha como con combo curl bash.
fuente