আমি কিভাবে একটি ফাইল তৈরির সময় খুঁজে পেতে পারি?


64

আমাকে একটি ফাইল তৈরির সময় খুঁজে বের করতে হবে, যখন আমি এই সমস্যাটি সম্পর্কে কিছু নিবন্ধ পড়ি, সমস্ত উল্লেখ করে যে কোনও সমাধান নেই (যেমন সাইট 1 , সাইট 2 )।

আমি যখন statকমান্ডটি চেষ্টা করলাম তখন তা লেখা আছে Birth: -

সুতরাং আমি কিভাবে একটি ফাইল তৈরির সময় খুঁজে পেতে পারি?


2
মনে রাখবেন যে কোনও ফাইলের তৈরির সময়টি সঠিক হওয়ার গ্যারান্টিযুক্ত নয়। একটি ফাইলে তৈরি তারিখগুলি 'ফাজ' করার অনেকগুলি উপায় রয়েছে।
থমাস ওয়ার্ড

1
@ থমাস ওয়ার্ড অন্যান্য ফাইল ডেটা ফাড করার উপায় ছাড়াও কি আরও অনেক কিছু?
সিস টিমারম্যান

উত্তর:


67

ডিরেক্টরি তৈরির তারিখটি জানার একটি উপায় রয়েছে, কেবল এই পদক্ষেপগুলি অনুসরণ করুন:

  1. কমান্ড দ্বারা ডিরেক্টরিটির ইনোডটি জানুন ls -i(উদাহরণস্বরূপ এটির এক্সটি বলে দিন )

  2. df -T /pathকমান্ড দ্বারা আপনার ডিরেক্টরিটি কোন বিভাগে সংরক্ষণ করা হয়েছে তা জানুন (আসুন এটি বলা যাক /dev/sda1)

  3. এখন এই কমান্ডটি ব্যবহার করুন: sudo debugfs -R 'stat <X>' /dev/sda1

আপনি আউটপুট দেখতে পাবেন:

crtime: 0x4e81cacc:966104fc -- mon Sep 27 14:38:28 2013

ক্রাইটাইম হ'ল আপনার ফাইল তৈরির তারিখ।

আমি যা পরীক্ষা করেছি :

  1. নির্দিষ্ট সময়ে একটি ডিরেক্টরি তৈরি করেছে।
  2. এটি অ্যাক্সেস করা হয়েছে।
  3. একটি ফাইল তৈরি করে এটি পরিবর্তন করেছে।

  4. আমি আদেশটি চেষ্টা করেছিলাম এবং এটি একটি সঠিক সময় দিয়েছে।

  5. তারপরে আমি এটিকে সংশোধন করেছি এবং আবারও পরীক্ষা করে দেখছি , ক্রাইমটাইম একই ছিল, তবে পরিবর্তন এবং অ্যাক্সেসের সময় পরিবর্তন হয়েছে।

আমি এটি পোস্ট করেছি, কারণ আমি আলোচনা করতে চাই তাই আমি আরও ভাল করে বুঝতে পারি, আমি অবাক হয়েছি কেন লোকেরা বলে যে লিনাক্স এই বৈশিষ্ট্যটি সমর্থন করে না
nux

13
কারণ লিনাক্স নিজেই তা করে না। Ext4 ফাইল সিস্টেমে এই তথ্য রয়েছে তবে কার্নেল এটি অ্যাক্সেসের জন্য একটি API সরবরাহ করে না। স্পষ্টতই, debugfsএটি ফাইল সিস্টেম থেকে সরাসরি বের করে যাতে কার্নেলের এপিআই ব্যবহার করার প্রয়োজন হয় না। এখানে দেখুন ।
টেরডন

আমি এটি পরীক্ষা করেছি। এটি এক্সট 4 ফাইল সিস্টেমে পুরোপুরি কাজ করেছে
ফাহিম বাবর প্যাটেল

1
এর মতো দেখে মনে হচ্ছে এক্সট্রোল ৪ নির্দিষ্ট? এটি আমার জন্য এক্সএফএসের সাথে কাজ করে নি।
কোয়ান্টাম 7

কার্নেল, জন্য glibc এবং coreutils সব এখন সমর্থন statx()মার্চ 2019. হিসাবে
hippietrail

54

@ নাকস এর জন্য একটি দুর্দান্ত সমাধান খুঁজে পেয়েছে যা আপনার সকলকে উত্সাহ দেওয়া উচিত। আমি সিদ্ধান্ত নিয়েছি একটি সামান্য ফাংশন লিখুন যা সরাসরি সমস্ত কিছু চালাতে ব্যবহৃত হতে পারে। শুধু এটি আপনার যুক্ত করুন ~/.bashrc

get_crtime() {

    for target in "${@}"; do
        inode=$(stat -c '%i' "${target}")
        fs=$(df  --output=source "${target}"  | tail -1)
        crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | 
        grep -oP 'crtime.*--\s*\K.*')
        printf "%s\t%s\n" "${target}" "${crtime}"
    done
}

এখন, আপনি get_crtimeযতগুলি ফাইল বা ডিরেক্টরি আপনার পছন্দ হিসাবে তৈরি করার তারিখ মুদ্রণ করতে চালাতে পারেন:

$ get_crtime foo foo/file 
foo Wed May 21 17:11:08 2014
foo/file    Wed May 21 17:11:27 2014

মনে রাখবেন যে, তৈরির তারিখ মূল ফাইলের তৈরির তারিখ ফাইলটি একটি অনুলিপি (যেমন তা না হয় হল পরিবর্তনের তারিখ সহ)। একবার কোনও ফাইল অনুলিপি করা হয়েছে, পরিবর্তনের তারিখটি আসল থেকে, তবে তৈরির তারিখটি অনুলিপি থেকে। (এই প্রশ্নে কিছু ভুল বোঝাবুঝি রয়েছে: Askubuntu.com / প্রশ্নগুলি / ৫৯৯৮85৫/২ )
জ্যাকব ভিলিজ

1
@ জ্যাকবভিলিজম ভাল, হ্যাঁ, অবশ্যই তা কি প্রকট নয়? কিভাবে এটি অন্যথায় হতে পারে? অনুলিপি একটি নতুন ফাইল যা কেবল অন্য সামগ্রীর মতোই ঘটে থাকে। পরিবর্তনের সময়টিও কোনও কপির জন্য পরিবর্তিত হয়। এটি অনুলিপি তৈরি করার মুহুর্তে সেট করা আছে যদি না আপনি স্পষ্টভাবে ব্যবহার করে cp -pবা এর অনুরূপ না ঘটে সে জন্য নির্বাচন না করেন ।
টেরডন

একেবারে, তবে এটি একই সাথে, মোডের মতো এটি অযৌক্তিক হবে না। তারিখ, ফাইলের কোথাও তারিখটি উত্পন্ন হওয়ার পরে সংরক্ষণ করা হবে। আমি অবশ্যই স্বীকার করব যে আমি লিঙ্কিত প্রশ্নের উত্তর না দেওয়া পর্যন্ত আমি জানতাম না যে এটি ছিল না।
জ্যাকব Vlijm

কেবলমাত্র চেষ্টা করেই, আমি কেবল নটিলাসে ফাইলগুলি অনুলিপি করেছি, পরিবর্তনের তারিখটি যেমন ছিল (যেমন ছিল), এম। তারিখটি তৈরির তারিখের চেয়ে আগের।
জ্যাকব ভিলিজম

1
@ ডেমোঙ্গোলেম হ্যাঁ, এর সেন্টোস সংস্করণ বিকল্পটিকে dfসমর্থন করে বলে মনে হচ্ছে না --outputfs=$(df foo | awk '{a=$1}END{print a}'সেক্ষেত্রে আপনি সেই লাইনটি প্রতিস্থাপন করতে পারেন এবং ফাংশনটিও কাজ করবে। আমি এই উত্তরে যা দেখাব তা হ'ল ফাইল / ডিরেক্টরি লক্ষ্যগুলির জন্য সরাসরি চালানো যেতে পারে এমনভাবে গ্রহণযোগ্য উত্তর থেকে কমান্ডটি মোড়ানো একটি উপায়।
terdon

11

statসৃষ্টির সময় প্রদর্শনের অক্ষমতা stat(2)সিস্টেম কলটির সীমাবদ্ধতার কারণে , যার রিটার্ন স্ট্রাক্ট নির্মাণের সময়টির জন্য কোনও ক্ষেত্র অন্তর্ভুক্ত করে না। লিনাক্স ৪.১১ (যেমন, ১..১০ এবং আরও নতুন *) দিয়ে শুরু করে, তবে নতুন statx(2)সিস্টেম কল উপলব্ধ রয়েছে, যা তার রিটার্ন স্ট্রাক্টে একটি নির্মাণের সময় অন্তর্ভুক্ত করে।

* এবং সম্ভবত হার্ডওয়ার সক্ষমকরণ স্ট্যাক (HWE) কার্নেল ব্যবহার করে পুরানো এলটিএস রিলিজ। uname -rআপনি নিশ্চিত হয়ে কমপক্ষে ৪.১১ ব্যবহার করে কার্নেল ব্যবহার করছেন কিনা তা পরীক্ষা করে দেখুন।

দুর্ভাগ্যক্রমে, কোনও সি প্রোগ্রামে সিস্টেম কলগুলি কল করা সহজ নয়। সাধারণত গ্লিবসি একটি মোড়ক সরবরাহ করে যা কাজটি সহজ করে তোলে তবে গ্লিবসি কেবল statx(2)আগস্ট 2018 এর জন্য একটি মোড়ক যুক্ত করেছে (সংস্করণ 2.28 , 18.10 এ উপলব্ধ)। ভাগ্যক্রমে, @ হোয়াট ওয়াগনার একটি নমুনা সি প্রোগ্রাম লিখেছেন যা statx(2)x86 এবং x86-64 সিস্টেমে সিস্টেম কলটি কীভাবে ব্যবহার করতে পারে তা দেখায় । এর আউটপুটটি statকোনও বিন্যাসের বিকল্প ছাড়াই ডিফল্ট হিসাবে একই ফর্ম্যাট , তবে এটি কেবল জন্মের সময় মুদ্রণের জন্য এটি পরিবর্তন করা সহজ।

প্রথমে এটি ক্লোন করুন:

git clone https://github.com/whotwagner/statx-fun

আপনি statx.cকোডটি সংকলন করতে পারেন , বা আপনি যদি জন্মের সময়টি চান birth.cতবে নীচের কোডটি দিয়ে ক্লোনযুক্ত ডিরেক্টরিতে একটি তৈরি করুন (যা statx.cন্যানোসেকেন্ড যথার্থতা সহ সৃজন টাইমস্ট্যাম্প মুদ্রণের নূন্যতম সংস্করণ ):

#define _GNU_SOURCE
#define _ATFILE_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include "statx.h"
#include <time.h>
#include <getopt.h>
#include <string.h>

// does not (yet) provide a wrapper for the statx() system call
#include <sys/syscall.h>

/* this code works ony with x86 and x86_64 */
#if __x86_64__
#define __NR_statx 332
#else
#define __NR_statx 383
#endif

#define statx(a,b,c,d,e) syscall(__NR_statx,(a),(b),(c),(d),(e))

int main(int argc, char *argv[])
{
    int dirfd = AT_FDCWD;
    int flags = AT_SYMLINK_NOFOLLOW;
    unsigned int mask = STATX_ALL;
    struct statx stxbuf;
    long ret = 0;

    int opt = 0;

    while(( opt = getopt(argc, argv, "alfd")) != -1)
    {
        switch(opt) {
            case 'a':
                flags |= AT_NO_AUTOMOUNT;
                break;
            case 'l':
                flags &= ~AT_SYMLINK_NOFOLLOW;
                break;
            case 'f':
                flags &= ~AT_STATX_SYNC_TYPE;
                flags |= AT_STATX_FORCE_SYNC;
                break;
            case 'd':
                flags &= ~AT_STATX_SYNC_TYPE;
                flags |= AT_STATX_DONT_SYNC;
                break;
            default:
                exit(EXIT_SUCCESS);
                break;
        }
    }

    if (optind >= argc) {
        exit(EXIT_FAILURE);
    }

    for (; optind < argc; optind++) {
        memset(&stxbuf, 0xbf, sizeof(stxbuf));
        ret = statx(dirfd, argv[optind], flags, mask, &stxbuf);
        if( ret < 0)
        {
            perror("statx");
            return EXIT_FAILURE;
        }
        printf("%lld.%u\n", *&stxbuf.stx_btime.tv_sec, *&stxbuf.stx_btime.tv_nsec);
    }
    return EXIT_SUCCESS;
}

তারপর:

$ make birth
$ ./birth ./birth.c
1511793291.254337149
$ ./birth ./birth.c | xargs -I {} date -d @{}
Mon Nov 27 14:34:51 UTC 2017

তত্ত্বগতভাবে এটি সৃষ্টির সময়টিকে আরও অ্যাক্সেসযোগ্য করে তুলবে:

  • কেবল এক্সট * টির চেয়ে বেশি ফাইল সিস্টেমগুলি সমর্থন করা উচিত ( debugfsএটি ext2 / 3/4 ফাইল সিস্টেমগুলির জন্য একটি সরঞ্জাম এবং অন্যের জন্য অপ্রয়োজনীয়)
  • এটি ব্যবহার করার জন্য আপনার মূলের দরকার নেই (কিছু প্রয়োজনীয় প্যাকেজ ইনস্টল করা বাদে, makeএবং linux-libc-dev)।

একটি এক্সএফএস সিস্টেম পরীক্ষা করা হচ্ছে, উদাহরণস্বরূপ:

$ truncate -s 1G temp; mkfs -t xfs temp; mkdir foo; sudo mount temp foo; sudo chown $USER foo
$ touch foo/bar
$ # some time later
$ echo > foo/bar
$ chmod og-w foo/bar
$ ./birth foo/bar | xargs -I {} date -d @{}
Mon Nov 27 14:43:21 UTC 2017
$ stat foo/bar                             
  File: foo/bar
  Size: 1           Blocks: 8          IO Block: 4096   regular file
Device: 700h/1792d  Inode: 99          Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ muru)      Gid: ( 1000/ muru)
Access: 2017-11-27 14:43:32.845579010 +0000
Modify: 2017-11-27 14:44:38.809696644 +0000
Change: 2017-11-27 14:44:45.536112317 +0000
 Birth: -

তবে এটি এনটিএফএস এবং এক্সফেটের জন্য কার্যকর হয়নি। আমি অনুমান করি যেগুলির জন্য ফুস ফাইল সিস্টেমগুলি তৈরির সময় অন্তর্ভুক্ত করে নি।


যদি বা পরিবর্তে, গ্লিবসি statx(2)সিস্টেম কলের জন্য সমর্থন যোগ করে , statশীঘ্রই অনুসরণ করা হবে এবং আমরা এর জন্য প্লেইন পুরাতন statকমান্ডটি ব্যবহার করতে সক্ষম হব । তবে আমি মনে করি না যে এটি এলটিএস রিলিজগুলিতে আরও নতুন কার্নেল পেলে ব্যাকপোর্ট করা হবে। তাই, আমি আশা করি না statউপর কোনো বর্তমান LTS রিলিজ কি কখনো ম্যানুয়াল হস্তক্ষেপ ছাড়াই সৃষ্টি সময় প্রিন্ট করতে (14.04, 16,04 বা 18.04)।

১৮.১০-তে, তবে আপনি সরাসরি statxবর্ণিত ফাংশনটি সরাসরি ব্যবহার করতে পারেন man 2 statx(দ্রষ্টব্য যে 18.10 ম্যানপেজটি ভুলভাবে আবশ্যক যে গ্লিবসি এখনও মোড়কে যুক্ত করে নি)।


গিথুবকে সংযুক্ত করার জন্য ধন্যবাদ আমি কয়েক মাস আগে অনুসন্ধান করেছি যখন 4.11 বেরিয়ে এসে কিছু খুঁজে পেল না এবং তারপরে এটি ভুলে গিয়েছিল।
WinEunuuchs2Unix

@ উইনউইউউচস ইউনিক্স পিং দিয়ে ক্ষমা করে দিয়েছে তবে মুরার অ্যাকাউন্টে কেন ন্যায়বিচারের খাতা রয়েছে তা মেটা সাইটে জিজ্ঞাসা করা কি বুদ্ধিমানের কাজ হবে 1?
জর্জ উদোসেন

পছন্দ করুন যদিও আমার একটা
কুঁচি আছে

@ জর্জিউডোসেন সাময়িকভাবে সাসপেনশন সম্পর্কে একটি সাম্প্রতিক মেটা প্রশ্ন রয়েছে এবং তারা কোনও নির্দিষ্ট ব্যবহারকারীর উদ্দেশ্যে সম্বোধন করবে না: meta.askubuntu.com/questions/18341/… আমি এখন চ্যাট রুমে যাচ্ছি যাতে আপনি সেখানে কথোপকথন চালিয়ে যেতে পারেন যদি আপনি কামনা করি।
WinEunuuchs2Unix

বৈশিষ্ট্যটি এখন উপলভ্য, আপনি কীভাবে সেই ক্ষেত্রটি সংশোধন করবেন? পাইথনে এটি করার জন্য আমি সাইটিপস রেপার তৈরি করার চেষ্টা করতে পারি। ধন্যবাদ।
গ্রিঙ্গো সুভেভ

3

টিএল; ডিআর: মাত্র চালান: sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>

(আপনার fs বের করতে, চালান df -T /path/to/your/file, সম্ভবত এটি হতে চলেছে /dev/sda1)।

দীর্ঘ সংস্করণ:

আমরা দুটি কমান্ড চালাতে যাচ্ছি:

  1. আপনার ফাইলের জন্য পার্টিশনের নামের সন্ধান করুন।

    df -T /path/to/your/file

    আউটপুটটি দেখতে দেখতে (পার্টিশনের নামটি প্রথম):

    Filesystem     Type 1K-blocks    Used Available Use% Mounted on
    /dev/<your fs> ext4   7251432 3481272   3509836  50% /
    
  2. এই ফাইলটির জন্য সৃষ্টির সময়টি সন্ধান করুন।

    sudo debugfs -R 'stat /path/to/your/file' /dev/<your fs>
    

    আউটপুটে, সন্ধান করুন ctime

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