मैं एक ls कैसे करूं और फिर बनाई गई तारीख तक परिणामों को क्रमबद्ध करूं?


112

किस क्रम में दिनांकित द्वारा आदेश दिए गए हैं? निश्चित रूप से अल्फ़ान्यूमेरिक आदेश नहीं।

ls -ltसंशोधन के समय के अनुसार। लेकिन मुझे सृजन का समय चाहिए।



1
वहाँ है एक तरह से करता है, तो फ़ाइल एक ext4 फ़ाइल सिस्टम पर है लिनक्स में फ़ाइल निर्माण समय प्राप्त करने के लिए होने लगते हैं। देखें: unix.stackexchange.com/a/131347/182996
kaartic

जवाबों:


94

अधिकांश यूनियनों में फ़ाइल निर्माण समय की अवधारणा नहीं है। lsजानकारी दर्ज न होने के कारण आप इसे प्रिंट नहीं कर सकते । यदि आपको निर्माण समय की आवश्यकता है, तो संस्करण नियंत्रण प्रणाली का उपयोग करें : निर्माण समय को चेक-इन समय के रूप में परिभाषित करें।

यदि आपके यूनिक्स संस्करण का निर्माण समय है, तो इसके प्रलेखन को देखें। उदाहरण के लिए, मैक ओएस एक्स पर (केवल एक उदाहरण जो मुझे ¹ का पता है), उपयोग करें ls -tU। विंडोज एक निर्माण समय भी संग्रहीत करता है, लेकिन यह हमेशा यूनिक्स उपयोगिताओं के बंदरगाहों के संपर्क में नहीं होता है, उदाहरण के लिए साइगविन के lsपास इसे दिखाने का विकल्प नहीं है। statउपयोगिता, निर्माण के समय, "जन्म समय" जीएनयू उपयोगिताओं में कहा जाता दिखाएं जिससे Cygwin के तहत आप के साथ जन्म समय के अनुसार क्रमबद्ध फ़ाइलों को दिखा सकते हैं कर सकते हैं stat -c '%W %n' * | sort -k1n

ध्यान दें कि ctime ( ls -lc) फ़ाइल निर्माण समय नहीं है , यह inode परिवर्तन का समय है। जब भी फ़ाइल में बदलाव (सामग्री या मेटाडेटा) के बारे में कुछ भी नहीं लिखा जाता है, तब इनकोड परिवर्तन का समय अपडेट किया जाता है, सिवाय इसके कि जब फ़ाइल को केवल पढ़ा जाता है तब भी अपडेट नहीं किया जाता है (भले ही एटीम अपडेट किया गया हो)। विशेष रूप से, माइम हमेशा की तुलना में हाल ही में अधिक है (फ़ाइल सामग्री संशोधन समय) जब तक कि माइम को भविष्य में स्पष्ट रूप से किसी तिथि पर सेट नहीं किया गया हो।


1
में Cygwin यह है ls -cls --helpदिखाता है कि क्या -cसंयुक्त -lऔर के साथ क्या करता है -lt
एरोन डी। मरास्को

6
@ ऐरन नहीं, समय निर्माण समय नहीं है। यह पूरी तरह से इस तथ्य पर आधारित एक आम भ्रम है कि "समय" और "सृजन" एक ही अक्षर से शुरू होते हैं, लेकिन समय और निर्माण समय के बीच कोई संबंध नहीं है। मैंने इस भ्रम को दूर करने के लिए अपना उत्तर अपडेट कर दिया है।
गाइल्स

मेरी बुर को चाटो। मैं हां के लिए सिगविन भाग की पुष्टि करने की कोशिश कर रहा था (IIRC आपके मूल पोस्ट में एक संभावित कमांड था)। अगर मैंने ध्यान दिया होता तो यह विशेष रूप से "समय (फ़ाइल स्थिति की जानकारी के अंतिम संशोधन का समय)" कहता है।
आरोन डी। मरास्को

@Gilles उत्तर में जोड़ना; मैं एक NFS 3.x फ़ाइल सर्वर का उपयोग करता हूं (अंतर्निहित फ़ाइल सिस्टम पर अनिश्चित; यह या तो UFS या ZFS है, हालांकि मैं FFS का अनुमान लगा रहा हूं)। रेडहैट 6.x के तहत: -Uनिर्माण समय के अनुसार। Solaris 10.x के तहत: निर्माण के समय का /usr/bin/lsसमर्थन -U, /usr/ucb/lsसमर्थन -Uऔर क्रमबद्ध नहीं करता है। ये परिणाम स्पष्ट रूप से पहली बार उस जानकारी को संग्रहीत करने वाले फाइल सिस्टम पर निर्भर करते हैं।
ब्रायन वंडेनबर्ग

1
@ghoti यदि निर्देशिका में कोई फाइल कभी डिलीट नहीं हुई (या स्थानांतरित / नामांकित / हार्डलिंक /…) की गई है, तो निर्देशिका ऑर्डर कुछ फाइल सिस्टम पर क्रिएशन ऑर्डर है, लेकिन सभी नहीं। उदाहरण के लिए, ext4 पर यह सच नहीं है। मुझे नहीं पता कि यह सोलारिस के यूएफएस पर सच है।
गाइल्स

16

दुर्भाग्य से, stat(2)एपीआई फ़ाइल निर्माण समय प्राप्त करने का एक तरीका प्रदान नहीं करता है, क्योंकि यह यूनिक्स मानकों द्वारा आवश्यक नहीं है

हालाँकि, कुछ फ़ाइल सिस्टम, ext4फ़ाइल मेटाडेटा के भीतर इस जानकारी को सहेजते हैं। इसे प्राप्त करने का कोई मानक तरीका नहीं है, लेकिन एक तरीका है ( extकेवल फाइलसिस्टम):

debugfs -R 'stat partition/relative/path/to/file' /dev/sda1

यदि आप उपयोग करते हैं तो आपको ऐसा कुछ उल्लेख करना होगा crtime( नहीं ctime !) ext4

 ctime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
 atime: 0x513dd8f1:04df0b20 -- Mon Mar 11 14:15:29 2013
 mtime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
crtime: 0x513a259a:35191a3c -- Fri Mar  8 18:53:30 2013

इस आदेश को वापस आने में कुछ समय लग सकता है, शायद इसलिए यह फ़ाइल से संबंधित हर सीमा को भी सूचीबद्ध करता है।

अब अगर आप करना चाहते आदेश निर्माण तिथि से फाइलें, मुझे लगता है कि यह आसानी से (और न ही ठीक से) संभव नहीं है। जैसा कि गिल्स कहते हैं, यह शायद आसान होगा यदि आप एक संशोधन नियंत्रण प्रणाली का उपयोग करेंगे। लेकिन आप ext4एपीआई पर एक नजर डालने की कोशिश कर सकते हैं ...

मैंने सफलता के बिना (हाल ही में) उबंटू प्रणाली stat -c '%w' myfileपर एक ext4फाइलसिथम पर कमांड की कोशिश की (यह सिर्फ जवाब देता है -)।


अगर किसी को एक लाइनर चाहिए:f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Boop

3

यहाँ एक पर्ल स्क्रिप्ट है जो आप क्या चाहते हैं (यदि आपका फाइल सिस्टम ext4 है) प्राप्त करने के लिए टॉटर के उत्तर का उपयोग करता है।

मेरे होम मशीन (उबंटू) और मेरे सर्वर (सेंटोस) पर काम करता है, लेकिन इससे परे परीक्षण नहीं किया गया है, इसलिए यमव।

#!/usr/bin/env perl

use Modern::Perl '2009';

use DateTime;


# Open the current directory for reading
opendir my $dh, "." or die "Unable to open directory: $!";

# Create a hash to save results into
my %results;
my %datestamp;

# Loop through the directory getting creation date stats for each file
while ( my $filename = readdir $dh ) {
    # Skip non-files
    next if $filename eq '.' or $filename eq '..';

    # Save the ls output for this file/directory
    $results{ $filename } = `ls -ld $filename`;

    my $stats = `debugfs -R 'stat $filename' /dev/sda6 2>/dev/null`;
    # crtime: 0x51cd731c:926999ec -- Fri Jun 28 12:27:24 2013
    $stats =~ m/crtime\: \w+\:\w+ -- (.+?)\n/s;
    my $datestring = $1;

    # Dissect date with a regexp, ick
    my %months = (
        'Jan' => '1',
        'Feb' => '2',
        'Mar' => '3',
        'Apr' => '4',
        'May' => '5',
        'Jun' => '6',
        'Jul' => '7',
        'Aug' => '8',
        'Sep' => '9',
        'Oct' => '10',
        'Nov' => '11',
        'Dec' => '12',
    );
    $datestring =~ m/\w+ (\w+)  ?(\d+) (\d\d)\:(\d\d)\:(\d\d) (\d\d\d\d)/;

    # Convert date into a more useful format
    my $dt = DateTime->new(
        year   => $6,
        month  => $months{$1},
        day    => $2,
        hour   => $3,
        minute => $4,
        second => $5,
    );

    # Save the datestamp for this result
    $datestamp{ $filename } = $dt->iso8601;
}

# Output in date order
my @filenames = sort { $datestamp{$a} gt $datestamp{$b} } keys %datestamp;

foreach my $filename ( @filenames ) {
    print $results{ $filename };
}

यह उल्लेख करने के लिए भी अच्छा है कि कुछ फाइलों में मेटाडेटा (जैसे एक्सिफ) हो सकता है जो निर्माण की तारीख / समय रिकॉर्ड करता है। यदि आपकी सभी फाइलें उदाहरण के लिए डिजिटल फोटो होती हैं, तो आपके पास यह डेटा होने की सबसे अधिक संभावना है। यहाँ पर्ल की छवि का उपयोग करके एक उदाहरण दिया गया है :: ExifTool
जोनाथन क्रॉस

0

ls -lctनिर्माण तिथि के अनुसार फ़ाइलों को सॉर्ट करने के लिए इस कमांड का उपयोग करें ।


2
हाँ जो "सही" कमांड नहीं है, लेकिन यह वह है जो आप ज्यादातर मामलों में देख रहे हैं
पागल रात

क्या "खोजने" के साथ ऐसा करने का एक तरीका है ताकि यह उपनिर्देशिकाओं की सभी फाइलों को इस तरह प्रिंट करे?
कॉलिन डी

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