ম্যাক অ্যাপস কীভাবে কোনও ফাইলের অবস্থান ট্র্যাক করতে সক্ষম?


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

সম্পাদনা করুন:

statআইএমএসওপি দ্বারা হাইলাইট করা সংযুক্ত উত্তর অনুসারে আপনি ভলিউম এবং ইনোড নম্বরটির আইডি পেতে ব্যবহার করেন।

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, যেহেতু এটি আপনাকে ভলিউম / ডিভাইস আইডি পাশাপাশি ফাইল আইডি / ইনোড নম্বরটি বলে দেয়।
আইএমএসওপি

4
ডেবিয়ানে আমার কাছে নেই /.vol/এবং এটি এখনও ঘটে (যদিও আমার প্রয়োজন pwd -P, তবেই প্লেইনের আউটপুট pwdআপডেট হবে)। আমি অনুমান করি প্রোগ্রামগুলিকে কোনও বিশেষ পাথের মাধ্যমে ফাইলগুলি খুলতে হবে না কারণ সাধারণত তারা কার্নেলের দ্বারা আয়নডগুলিতে ম্যাপযুক্ত ফাইল বর্ণনাকারী (এবং রাখা) পায়। আমি ম্যাক সম্পর্কে সন্দেহ এছাড়াও/.vol/ অপরিহার্য নয়।
কামিল ম্যাকিয়েরোস্কি

সুতরাং আপনি যদি কোনও ফাইলকে অন্য কোনও ডিস্কে স্থানান্তর করেন তবে এই স্কিমটি বিরতি।
জোয়েল কোহর্ন

1
@ জোয়েলকোহর্ন হ্যাঁ, তবে প্রযুক্তিগতভাবে আপনি কোনও ফাইলকে অন্য ডিস্কে স্থানান্তর করতে পারবেন না । আপনি এটি অন্য ডিস্কে অনুলিপি করতে পারেন, তারপরে এটি মুছে ফেলুন এবং "এক ধাপ" হিসাবে এটি করার শর্টকাট রয়েছে তবে এটি এখনও একটি অনুলিপি-মুছে ফেলা হয়, সরানো নয়, সুতরাং, প্রযুক্তিগতভাবে একটি আলাদা ফাইল।
ইব্রুয়েস্টার

1
অনেক পাঠ্য সম্পাদক একটি প্রদত্ত ফাইল পড়েন, এটিকে বন্ধ করে দেন, এর অনুলিপিটি নিয়ে কাজ করেন এবং একই পথে সংরক্ষণ করেন, তাই তারা ফাইলটি পুরানো স্থানে পুনরায় তৈরি করেন। তবে তারা ফাইলটি সর্বদা খোলা রাখে এবং একেবারে শেষে লিখতে পারে। আমার bashঅন ​​ডেবিয়ান তা করে। আমি দৌড়েছি exec 3<>foo, তারপরে fooএকই ফাইল সিস্টেমের মধ্যে সরে এসেছি , তারপরে নতুন echo whatever >&3লোকেশনটিতে চেক করেছি foo- এবং এটি পরিবর্তন হয়েছে। যদিও bashফাইলের মধ্যে সন্ধান করতে পারে না, সাধারণভাবে অন্যান্য প্রোগ্রামগুলি পারে। আমার বক্তব্য /.vol/অপরিহার্য নয়, প্রোগ্রামগুলি সহজেই এগুলি ছাড়া কাজ করতে পারে। অথবা পার্থক্য কী তা আমি পাই না।
কামিল ম্যাকিয়েরোভস্কি

1

নীচের উত্তরটি মিথ্যা (মন্তব্য দেখুন)। উপেক্ষা করুন


কার্ডিপি দেওয়া উত্তরের উত্তরের পাশাপাশি সম্ভবত এটি হতে পারে যে আপনার প্রোগ্রামগুলি কেবল একটি ফাইল হ্যান্ডেল ধরে রেখেছে , যা ডিরেক্টরি ট্রিতে থাকা ফাইলের অবস্থানের চেয়ে আলাদা (এবং ইউনিক্স সিস্টেমে এমনকি ফাইল মুছে ফেলা অব্যাহত রাখে, যতক্ষণ না আপনি এটি বন্ধ না করে )।

একটি ফাইল হ্যান্ডেল মূলত ফাইলের সরাসরি অ্যাক্সেস, যেখানে বা কতবার (হার্ডলিঙ্কের ক্ষেত্রে) এটি ডিরেক্টরি কাঠামোর মধ্যে উপস্থিত থেকে পৃথক independent


নাহ, আপনি এটিও পান নি, আমি মনে করি ... @ কমিলম্যাসিওরওস্কিতে আমার মন্তব্য দেখুন। ফাইলহ্যান্ডেলটি পরিবর্তন হয় না, আপনি যখন ফাইলটি সংরক্ষণ করেন তখন একটি নতুন ফাইল আসল অবস্থানে তৈরি করা হয় .... ম্যাকোজে না!
thecarpy

1
আপনি সঠিক, এটি খুব অপ্রত্যাশিত এবং ইউনিক্সের থেকে সম্পূর্ণ ভিন্ন। :(
টম

সম্মত এবং upvated!
thecarpy

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

অস্বীকৃতি: আমি "অন্তর্ভুক্ত" তালিকাটি ছাঁটাইনি, একটি পয়েন্ট প্রমাণ করার জন্য এটি দ্রুত একত্রে হ্যাক করা হয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.