¿Cómo pueden las aplicaciones de Mac rastrear la ubicación de un archivo?

18

Observo comportamientos como este en mi Mac:

  • Abra un PDF con PDF Expert, realice algunos cambios en el archivo, mueva el archivo en Finder, guárdelo en PDF Expert y se guardará correctamente en el nuevo lugar.
  • Abra un shell en un directorio como ~/foo, deseche el directorio con otra aplicación y el pwd del shell se generará correctamente ~/.Trash/foo.

¿Qué está pasando debajo del capó? Estos casos parecen indicar que las aplicaciones no solo contienen una ruta absoluta del archivo como emacs (¿estoy en lo cierto con esto?) ¿O es un mecanismo totalmente diferente?

nichijou
fuente

Respuestas:

21

macos tiene un /.vol/sistema especial asignado al directorio y los archivos reales. Se puede acceder a los archivos y directorios /.vol/<device_id>/<inode_number>, independientemente de dónde se encuentren los archivos en el sistema de archivos.

Es un pequeño sistema agradable.

Por lo tanto, los programas pueden obtener, por ejemplo, el número de inodo /Users/jdoe/someFile.txty luego abrirlo a través de /.vol/12345/6789(en este caso, la identificación del dispositivo es 12345 y el número de inodo 6789). Luego te mueves a /Users/jdoe/someFile.txtdonde quieras (en el mismo volumen) y todo funciona. Incluso puede escribir un script de shell que lo admita magic.

ls -di <file> para obtener el número de inodo.

$ ls -di /User/jdoe/someFile.txt
6789 /User/jdoe/someFile.txt

EDITAR:

Se usa statpara obtener la identificación del volumen y el número de inodo, de acuerdo con la respuesta vinculada, tal como lo resalta IMSoP.

GetFileInfo /.vol/12345/6789devolvería la ubicación actual del archivo ubicado previamente en /Users/jdoe/someFile.txt.

Consulte /programming/11951328/is-there-any-function-to-retrieve-the-path-associated-with-an-inode para obtener más información.

thecarpy
fuente
1
De acuerdo con las respuestas vinculadas, states un comando más útil aquí que ls -di, ya que le indica el volumen / ID del dispositivo, así como la ID del archivo / número de inodo.
IMSoP
44
En Debian no tengo /.vol/y esto todavía sucede (aunque lo necesito pwd -P, solo entonces pwdse actualiza la salida de plain ). Supongo que los programas no tienen que abrir archivos a través de ninguna ruta especial porque en general obtienen (y mantienen) descriptores de archivos que el núcleo asigna de todos modos a los inodos. Yo sospecho que en Mac /.vol/no es esencial también.
Kamil Maciorowski
Entonces, si mueve un archivo a un disco diferente, este esquema se rompe.
Joel Coehoorn
1
@JoelCoehoorn Sí, pero técnicamente no puede mover un archivo a un disco diferente. Puede copiarlo en el otro disco, luego eliminarlo, y hay accesos directos para hacerlo como "un paso", pero sigue siendo una copia y eliminación, no un movimiento, por lo que técnicamente es un archivo diferente.
ibrewster
1
Muchos editores de texto leen un archivo determinado, lo cierran, trabajan con su copia y lo guardan en la misma ruta, por lo que recrean el archivo en su ubicación anterior. Pero pueden mantener el archivo abierto todo el tiempo y escribir al final. Mi bashen Debian hace eso. Corro exec 3<>foo, luego me muevo foodentro del mismo sistema de archivos, echo whatever >&3luego ingresé fooen la nueva ubicación, y ha cambiado. Aunque bashno puede buscar dentro del archivo, otros programas en general sí pueden. Mi punto es /.vol/que no es esencial, los programas pueden funcionar fácilmente sin esto. O no entiendo cuál es la diferencia.
Kamil Maciorowski el
1

La respuesta a continuación es falsa (ver comentarios). Por favor, no hagas caso


Además de la buena respuesta que dio thecarpy, es probable que sus programas simplemente contengan un identificador de archivo , que es independiente de la ubicación de los archivos en el árbol de directorios (y en los sistemas Unix incluso persiste la eliminación del archivo, al menos hasta que lo cierre )

Un identificador de archivo es básicamente el acceso directo al archivo, independientemente de dónde o con qué frecuencia (en el caso de los enlaces duros) existe en la estructura del directorio.

Tom
fuente
No, tampoco lo entendiste, creo ... mira mi comentario a @KamilMaciorowski. El identificador de archivo no cambia, cuando guarda el archivo, se crea un nuevo archivo en la ubicación original ... ¡no en macos!
thecarpy
1
Tienes razón, eso es muy inesperado y muy diferente a Unix. :(
Tom
De acuerdo y votado!
thecarpy
0

Si bien no estoy seguro de por qué Macos usa esto en lugar de la funcionalidad C estándar, suponiendo que lo que leí hace años en "Mac OS X Unleashed" es correcto, resulta que aprendí algo nuevo, nuevamente.

Mire el siguiente programa simple en C:

#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    struct timespec ts;
        ts.tv_sec = 10;
        ts.tv_nsec = 0;
    FILE * fp;

    fp = fopen("file.txt", "a");
    int f = fileno(fp);

    if (fp == NULL)
    {
        printf("Error opening file!\n");
        exit(1);
    }

    struct stat file_stat;
    int ret;
    ret = fstat (f, &file_stat);
    printf("inode number is %d\n", file_stat.st_ino);
    nanosleep(&ts, NULL);

    printf("Finished sleep, writing to file.\n");

/* print some text */
    const char *text = "Write this to the file";
    dprintf(f, "Some text: %s\n", text);

/* print integers and floats */
    int i = 1;
    float py = 3.1415927;
    dprintf(f, "Integer: %d, float: %f\n", i, py);

/* printing single characters */
    char c = 'A';
    dprintf(f, "A character: %c\n", c);

    close(f);
}

Compile el programa, ejecútelo en segundo plano y rápidamente mv file.txt file2.txtANTES de que el programa imprima "Finalizado el sueño, escribiendo en el archivo". (tienes 10 segundos)

Observe que file2.txttiene el resultado de su programa, aunque se movió antes de que el texto se imprimiera en el archivo (a través del descriptor de archivo).

$ gcc myfile.c
$ ./a.out &
[1] 21416
$ inode number is 83956
$ ./mv file.txt file2.txt
$ Finished sleep, writing to file.
[1]+  Done                    ./a.out
$ cat file2.txt
Some text: Write this to the file
Integer: 1, float: 3.141593
A character: A

DESCARGO DE RESPONSABILIDAD: No he eliminado la lista de "incluir", esto fue rápidamente pirateado para probar un punto.

thecarpy
fuente