क्या SunOS के लिए linux पर `find` कमांड का कोई विकल्प है?


10

findलिनक्स पर आदेश की तुलना में विकल्प की एक बहुत है findपर SunOS या सोलारिस आदेश।

मैं findइस तरह से कमांड का उपयोग करना चाहता हूं :

find data/ -type f -name "temp*" -printf "%TY-%Tm-%Td %f\n" | sort -r

यह लिनक्स मशीन पर पूरी तरह से ठीक काम करता है, लेकिन एक ही कमांड -printfमें SunOS मशीन का विकल्प नहीं है । मैं "%TY-%Tm-%Td %f\n"प्रारूप में अपने आउटपुट को अनुकूलित करना चाहता हूं ।

कृपया SunOS के लिए कोई विकल्प सुझाएं।


5
findसोलारिस पर जीएनयू का उपयोग करने के लिए , खोजक पैकेज स्थापित करें ।
Kusalananda

जवाबों:


21

ध्यान दें कि इसका लिनक्स से कोई लेना-देना नहीं है; यह -printfविधेय GNU के कार्यान्वयन के लिए विशिष्ट है find। लिनक्स एक OS नहीं है, यह सिर्फ एक कर्नेल है जो कई OS में पाया जाता है। जबकि उन OS में से अधिकांश में एक GNU उपयोगकर्ताभूमि का उपयोग किया जाता था, अब लिनक्स का उपयोग करने वाले अधिकांश OS एम्बेडेड हैं और यदि उनके पास कोई भी है तो बुनियादी आदेश हैं।

जीएनयू findकमांड, जो लिनक्स से पहले होता है, को अधिकांश यूनिक्स जैसे ओएस पर स्थापित किया जा सकता है। लिनक्स के बाहर आने से पहले सोलारिस (इसे SunOS बैक कहा जाता है) पर इसका इस्तेमाल ज़रूर किया गया था।

आजकल, यह सोलारिस के लिए ओरेकल पैकेज के रूप में भी उपलब्ध है। सोलारिस 11 पर, यह है file/gnu-findutils, और कमांड का नाम है gfind(जीएनयू के लिए find, इसे सिस्टम के अपने findकमांड से अलग करने के लिए )।

अब, यदि आप पैकेज स्थापित नहीं कर सकते हैं, तो आपका सबसे अच्छा दांव शायद उपयोग करना है perl:

find data/ -type f -name "temp*" -exec perl -MPOSIX -le '
  for (@ARGV) {
    unless(@s = lstat($_)) {
      warn "$_: $!\n";
      next;
    }
    print strftime("%Y-%m-%d", localtime($s[9])) . " $_";
  }' {} + | sort -r

यहां, हम अभी भी findफ़ाइलों को खोजने के लिए (सोलारिस कार्यान्वयन) का उपयोग कर रहे हैं, लेकिन हम -execफ़ाइलों की सूची को पास करने के लिए इसके विधेय का उपयोग कर रहे हैं perl। और फ़ाइल मेटाडेटा (10 वें तत्व ( ) के रूप में संशोधन समय सहित) को पुनः प्राप्त करने के लिए प्रत्येक पर perlकरता है , स्थानीय समय-क्षेत्र में इसकी व्याख्या करता है ( ) और इसे प्रारूपित करता है ) जो तब फ़ाइल नाम के साथ होता है ( लूप चर है अगर कोई भी निर्दिष्ट नहीं है , और अंतिम सिस्टम कॉल विफलता के लिए त्रुटि पाठ के बराबर है )।lstat()$s[9]localtime()strftime()print$_perl$!stderror(errno)


क्या यह अच्छा नहीं होगा अगर GNU लोग एन्हांसमेंट लागू करने से पहले मौजूदा मानकों को देखें? lsप्रकार आउटपुट को निर्दिष्ट करने के लिए प्रारूप का उपयोग करने के बारे में पहले से ही एक मानक है , pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html
schily

5
@schily, GNU findका -printfPOSIX.2 पूर्ववर्ती है, इसलिए POSIX लोगों को यहां दोष देना है। यह भी ध्यान दें कि 2000 के दशक तक POSIX कल्पना सार्वजनिक नहीं थी। मैं अभी भी statएक दशक से अधिक के बाद अपने प्रारूप विनिर्देश के लिए एक अलग और अवर वाक्यविन्यास के साथ GNU लोगों को दोषी ठहराता हूं ।
स्टीफन चेजलस

आप यह बता सकते हैं कि जीएनयू ने उस सुविधा को कब जोड़ा था? चूंकि सोलारिस पैक्स 1998 से इस सूची मोड का समर्थन करता है, मुझे लगता है कि इसे SUSv2 के साथ पेश किया गया है।
विद्वान

1
तुम भी बस अपने खुद के बिन निर्देशिका में एक गन्नू खोज स्थापित कर सकते हैं और विहित निर्देशिकाओं से पहले खोज करने के लिए रास्ता निर्धारित किया है।
पीटर - मोनिका

@ सामान्य तौर पर, GNU का सबसे पुराना संस्करण है I के पास 1991 से 3.1 है, यह पहले से ही था -frf (3.1% k प्रारूप निर्देश) को जोड़ा गया है, चैंज का उल्लेख नहीं है जब इसे जोड़ा गया था, संभवतः यह शुरू से ही था।
चेंजलॉग

0

इसे अप्रोच करने का एक और तरीका find2perlस्क्रिप्ट के साथ है , जो findकमांड (यहाँ, एक सबसेट) को एक समान पर्ल स्क्रिप्ट के लिए कमांड करता है। पर्ल लिपि File::Findभारी उठाने के लिए एक मॉड्यूल का उपयोग करती है । क्योंकि मेरे सिस्टम पर find2perl स्क्रिप्ट ने -printfविधेय का समर्थन नहीं किया , इसलिए मैंने इसे मैन्युअल रूप से जोड़ा:

#! /usr/bin/perl -w

use strict;
use File::Find ();

use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid, $mtime, $year, $month, $day);

    if ((($dev,$ino,$mode,$nlink,$uid,$gid,undef,undef,undef,$mtime) = lstat($_)) &&
    -f _ &&
    /^temp.*\z/s) {
        (undef, undef, undef, $day, $month, $year) = localtime($mtime);
        $year += 1900;
        $month++;
        printf "%d-%d-%d %s\n", $year, $month, $day, $_;
    }
}

File::Find::find({wanted => \&wanted}, 'data/');
exit;

मेरे द्वारा बनाई गई दो नमूना फ़ाइलों पर, आउटपुट समान है:

$ tree data
data
├── subdir
   └── foo
       └── temp2
└── temp1

2 directories, 2 files

$ touch -d 2018-06-20 data/subdir/foo/temp2
$ touch -d 2018-05-19 data/temp1

$ find data/ -type f -name "temp*" -printf "%TY-%Tm-%Td %f\n" | sort -r
2018-06-20 temp2
2018-05-19 temp1

$ ./perlfind | sort -r
2018-06-20 temp2
2018-05-19 temp1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.