मैक ऐप्स किसी फ़ाइल के स्थान को ट्रैक करने में कैसे सक्षम हैं?


18

मैं अपने मैक पर इस तरह के व्यवहार का निरीक्षण करता हूं:

  • पीडीएफ एक्सपर्ट के साथ एक पीडीएफ खोलें, फाइल में कुछ बदलाव करें, फाइल को फाइंडर में स्थानांतरित करें, इसे पीडीएफ एक्सपर्ट में सेव करें और यह नई जगह पर सही ढंग से सेव हो जाएगा।
  • एक निर्देशिका में एक खोल खोलें जैसे ~/foo, किसी अन्य ऐप के साथ निर्देशिका को ट्रैश करें और शेल का पीडब्ल्यू सही ढंग से आउटपुट ~/.Trash/foo

हुड के नीचे क्या हो रहा है? इन मामलों से प्रतीत होता है कि ऐप केवल फ़ाइल का एक संपूर्ण पथ नहीं बनाते हैं जैसे कि एमएसीएस (क्या मैं इसके साथ सही हूं?), या यह पूरी तरह से अलग तंत्र है?

जवाबों:


21

मैकोस में /.vol/वास्तविक निर्देशिका और फ़ाइलों के लिए मैप की गई एक विशेष प्रणाली है। फ़ाइलें और निर्देशिकाओं के माध्यम से पहुँचा जा सकता है /.vol/<device_id>/<inode_number>, भले ही फ़ाइलें फ़ाइल सिस्टम पर हों।

यह एक अच्छा सा सिस्टम है।

इसलिए, प्रोग्राम उदाहरण के लिए इनोड संख्या प्राप्त कर सकते हैं /Users/jdoe/someFile.txtऔर फिर इसे खोल सकते हैं /.vol/12345/6789(इस मामले में, डिवाइस आईडी 12345 और इनोड संख्या 6789 है)। आप तब /Users/jdoe/someFile.txtकहीं भी जाना चाहते हैं (एक ही वॉल्यूम पर) और सब कुछ बस काम करता है। आप एक शेल स्क्रिप्ट भी लिख सकते हैं जो इसका समर्थन करती है magic

ls -di <file> इनोड नंबर प्राप्त करने के लिए।

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

संपादित करें:

आप statIMSoP द्वारा हाइलाइट किए गए लिंक के अनुसार वॉल्यूम और इनोड नंबर की आईडी प्राप्त करने के लिए उपयोग करते हैं।

GetFileInfo /.vol/12345/6789पहले स्थित फ़ाइल का वर्तमान स्थान लौटाएगा /Users/jdoe/someFile.txt

अधिक जानकारी के लिए /programming/11951328/is-there-any-function-to-retrieve-the-path-associated-with-an-inode देखें ।


1
लिंक किए गए उत्तरों के अनुसार, statयहां से अधिक उपयोगी कमांड है ls -di, क्योंकि यह आपको वॉल्यूम / डिवाइस आईडी के साथ-साथ फाइल आईडी / इनकोड नंबर बताता है।
IMSoP

4
डेबियन में मेरे पास नहीं है /.vol/और यह अभी भी होता है (हालांकि मुझे ज़रूरत है pwd -P, केवल सादे pwdका उत्पादन अपडेट किया गया है)। मुझे लगता है कि कार्यक्रमों को किसी विशेष पथ के माध्यम से फाइल खोलने की ज़रूरत नहीं है क्योंकि सामान्य रूप से वे (और रखते हैं) फ़ाइल डिस्क्रिप्टर जो वैसे भी कर्नेल द्वारा इनोड में मैप किए जाते हैं। मुझे शक है कि मैक /.vol/जरूरी नहीं है।
कामिल मैकियोरोव्स्की

इसलिए यदि आप किसी फ़ाइल को किसी भिन्न डिस्क पर ले जाते हैं, तो यह योजना टूट जाती है।
जोएल कोएहॉर्न

1
@JoelCoehoorn हाँ, लेकिन तकनीकी रूप से आप किसी फ़ाइल को किसी भिन्न डिस्क पर नहीं ले जा सकते । आप इसे दूसरी डिस्क पर कॉपी कर सकते हैं, फिर इसे हटा सकते हैं, और इसे "एक कदम" के रूप में करने के लिए शॉर्टकट हैं, लेकिन यह अभी भी एक कॉपी-और-डिलीट है, एक कदम नहीं है, इसलिए, तकनीकी रूप से एक अलग फ़ाइल है।
आइब्रीस्टर

1
कई टेक्स्ट एडिटर एक दी गई फ़ाइल को पढ़ते हैं, उसे बंद करते हैं, उसकी कॉपी के साथ काम करते हैं और उसी पथ पर सेव करते हैं, इसलिए वे फ़ाइल को उसके पुराने स्थान पर फिर से बनाते हैं। लेकिन वे फ़ाइल को हर समय खुला रख सकते हैं और इसे बहुत अंत में लिख सकते हैं। मेरा bashडेबियन ऐसा करता है। मैं दौड़ता हूं exec 3<>foo, फिर fooउसी फाइलसिस्टम के भीतर चला जाता हूं , फिर नए स्थान पर echo whatever >&3चेक fooकिया जाता है - और यह बदल जाता है। हालाँकि bash, फ़ाइल के भीतर सामान्य रूप से अन्य कार्यक्रमों की तलाश नहीं की जा सकती है। मेरी बात /.vol/जरूरी नहीं है, इसके बिना प्रोग्राम आसानी से काम कर सकते हैं। या मुझे फर्क नहीं पड़ता कि अंतर क्या है।
कामिल मैकियोरोस्की

1

नीचे दिया गया उत्तर गलत है (टिप्पणियों को देखें)। कृपया उपेक्षा कर दीजिये


दिए गए अच्छे उत्तर के अलावा, एस्कॉपी ने यह संभावना व्यक्त की है कि आपके प्रोग्राम केवल एक फ़ाइल हैंडल को पकड़े हुए हैं , जो कि डायरेक्टरी ट्री में फाइल लोकेशन से स्वतंत्र है (और यूनिक्स सिस्टम पर भी फाइल डिलीशन को जारी रखता है , कम से कम जब तक आप इसे बंद नहीं करते हैं। )।

एक फ़ाइल हैंडल मूल रूप से फ़ाइल तक सीधी पहुंच है, जहां या जहां (हार्डलिंक के मामले में) स्वतंत्र है, यह निर्देशिका संरचना में मौजूद है।


नहीं, आपको यह भी नहीं मिला, मुझे लगता है ... मेरी टिप्पणी @KamilMaciorowski पर देखें। फ़ाइलहैंडल नहीं बदलता है, जब आप फ़ाइल को सहेजते हैं, तो मूल स्थान पर एक नई फ़ाइल बनाई जाती है .... ऐसा मैकोस पर नहीं है!
11

1
आप सही हैं, यह बहुत अप्रत्याशित है और यूनिक्स के विपरीत है। :(
टॉम

सहमत और उत्थान!
दोपहर

0

हालांकि मैं अनिश्चित हूं कि मैकोस मानक सी कार्यक्षमता के बजाय इसका उपयोग क्यों करता है, यह मानते हुए कि मैंने "मैक ओएस एक्स अनलेशेड" में वर्षों पहले जो पढ़ा है वह सही है, यह पता चला है कि मैंने कुछ नया सीखा, फिर से।

कृपया निम्नलिखित सरल सी कार्यक्रम को देखें:

#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);
}

प्रोग्राम को संकलित करें, इसे पृष्ठभूमि में चलाएं और जल्दी mv file.txt file2.txtसे प्रोग्राम को प्रिंट करें "नींद पूरी करें, लेखन को फाइल करें।" (आपके पास 10 सेकंड हैं)

ध्यान दें कि file2.txtआपके प्रोग्राम का आउटपुट है, हालांकि इसे टेक्स्ट में फाइल (फाइल डिस्क्रिप्टर के माध्यम से) प्रिंट करने से पहले ले जाया गया था।

$ 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

अस्वीकरण: मैंने "शामिल" सूची को छंटनी नहीं की है, यह एक बिंदु साबित करने के लिए जल्दी से एक साथ हैक किया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.