Compruebe si dos rutas apuntan al mismo archivo


12

Tengo un script para crear enlaces simbólicos recursivos en mi directorio de inicio a mi directorio de configuración, para mantener los archivos bajo control de versión. Me gustaría omitir archivos que ya están enlazados a través de un directorio principal. Es decir, si tengo estos archivos / directorios:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

, ¿cómo verifico que ~ / foo / bar y ~ / settings / foo / bar son el mismo archivo?

Editar : D'oh, otros minutos de búsqueda revelaron la respuesta :readlink -f $path

Respuestas:


6

Si dos archivos tienen el mismo ID de dispositivo e inodo, son el mismo archivo. La statherramienta de línea de comando hace que sea fácil de encontrar

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

esto funciona para archivos enlazados o archivos enlazados.


55
Para seguir enlaces simbólicos, necesitas stat -L.
— Gilles 'SO- deja de ser malo'

Como dijo @Gilles, sin el interruptor -L, puede obtener resultados incorrectos en algunas distribuciones
— Olaseni

18

Muchos shells tienen un -efoperador para el testbuiltin (o su sinónimo [) para probar si dos rutas apuntan al mismo archivo existente (siguiendo enlaces simbólicos). Esto incluye bash, dash, pdksh, ksh88, ksh93 y zsh, pero no POSIX sh. En bash, ksh o zsh, también puede usar -efen la [[ … ]]construcción condicional.

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
Según mi página de manual, -ef hace exactamente lo mismo que la respuesta de Rich Homolka.
— user13852

2
@ user13852 -eftiene la ventaja de ser más portátil (también un poco más rápido, pero no para que lo notes la mayor parte del tiempo). Por ejemplo, funciona en * BSD, OSX, BusyBox, así como en Linux / Cygwin (GNU). También es más claro, ya que hace exactamente lo que se requiere. La única ventaja que puedo ver al llamar states cuando no quieres seguir enlaces simbólicos.
— Gilles 'SO- deja de ser malvado'

0

Para los enlaces suaves (creados con ln -s) puede usar realpath. Sin embargo, esto no funcionará para los enlaces duros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.