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.