সানোসের জন্য লিনাক্সের `Find` কমান্ডের কোনও বিকল্প আছে কি?


10

findলিনাক্স কমান্ড তুলনায় বিকল্প একটি অনেক আছে findউপর SunOS বা সোলারিস কমান্ড।

আমি findকমান্ডটি এভাবে ব্যবহার করতে চাই:

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

এটি একটি লিনাক্স মেশিনে পুরোপুরি সূক্ষ্মভাবে কাজ করে, তবে একই কমান্ডের -printfসুনোস মেশিনে বিকল্প নেই । আমি আমার আউটপুটটি "%TY-%Tm-%Td %f\n"ফর্ম্যাটে কাস্টমাইজ করতে চাই ।

SunOS এর জন্য কোনও বিকল্প প্রস্তাব করুন।


5
findসোলারিসে জিএনইউ ব্যবহার করতে , অনুসন্ধানের প্যাকেজটি ইনস্টল করুন ।
কুসালানন্দ

উত্তর:


21

নোট করুন যে লিনাক্সের সাথে এর কোনও সম্পর্ক নেই; যে -printfবিধেয় এর গনুহ বাস্তবায়ন নির্দিষ্ট find। লিনাক্স কোনও ওএস নয়, এটি কেবল বেশ কয়েকটি ওএসে পাওয়া কার্নেল। পূর্ববর্তী সময়ে এই ওএসগুলির বেশিরভাগ একটি জিএনইউ ব্যবহারকারীল্যান্ড ব্যবহার করত, এখন লিনাক্স ব্যবহার করে বেশিরভাগ ওএস এম্বেড করা আছে এবং যদি তাদের কোনও থাকে তবে প্রাথমিক কমান্ড রয়েছে।

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

আজকাল, এটি সোলারিসের জন্য এমনকি ওরাকল প্যাকেজ হিসাবে উপলব্ধ। সোলারিস ১১-এ 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। এবং ফাইল মেটাডেটা (দশম উপাদান ( ) হিসাবে পরিবর্তনের সময় সহ) পুনরুদ্ধার করার জন্য প্রত্যেকটিতে perlএকটি lstat()করে $s[9], এটি স্থানীয় টাইমজোন ( localtime()) এর মধ্যে ব্যাখ্যা করে এবং এটি ফর্ম্যাট করে ( strftime()) যা এটি printফাইলের নামের পাশাপাশি রয়েছে ( $_যদি লুপ পরিবর্তনশীল হয় তবে কোনওটিতে নির্দিষ্ট করা হয়নি perlএবং এটি সর্বশেষ সিস্টেম কল ব্যর্থতার জন্য ত্রুটি পাঠ্যের $!সমতুল্য stderror(errno))।


উন্নতকরণ বাস্তবায়নের আগে জিএনইউর লোকেরা বিদ্যমান মানদণ্ডগুলি না দেখলে ভাল লাগবে না? lsটাইপ আউটপুট নির্দিষ্ট করতে কোনও ফর্ম্যাট কীভাবে ব্যবহার করবেন সে সম্পর্কে ইতিমধ্যে একটি স্ট্যান্ডার্ড রয়েছে , পাবস.ওপেনগ্রুপ
onlinepubs

5
@ শিলি, জিএনইউ'র পসিএক্স ২. findএর -printfপূর্বাভাস, সুতরাং পসিক্স লোকেরা এখানে দোষারোপ করবে। আরও মনে রাখবেন যে 2000 এর দশক পর্যন্ত পসিক্স স্পেকটি সর্বজনীন ছিল না। আমি এখনও statদশক ধরে তার বিন্যাসের নির্দিষ্টকরণের জন্য একটি ভিন্ন এবং নিকৃষ্ট বাক্য গঠন সহ প্রবর্তনের জন্য জিএনইউ লোকদের দোষ দেব ।
স্টাফেন চেজেলাস

আপনি কী উল্লেখ করতে পারেন যখন জিএনইউ এটি বৈশিষ্ট্য যুক্ত করেছিল? যেহেতু সোলারিস প্যাক্স 1998 সাল থেকে এই তালিকা মোডটিকে সমর্থন করে, আমার ধারণা এটি এসইএসভি 2 এর সাথে চালু হয়েছে।
সুন্দরভাবে

1
এছাড়াও আপনি নিজের বাইন ডিরেক্টরিতে একটি gnu অনুসন্ধান করে ইনস্টল করতে পারেন এবং ন্যাশনাল ডিরেক্টরিগুলির আগে এটি অনুসন্ধানের পথ নির্ধারণ করতে পারেন।
পিটার - মনিকা পুনরায়

@ শিকল, আমার কাছে জিএনইউর সর্বাধিকতম সংস্করণটি 1991 থেকে 3.1, এটি ইতিমধ্যে প্রিন্টফ ছিল (3.1% কে ফর্ম্যাট নির্দেশটি যুক্ত করেছে), চেঞ্জলগটি যুক্ত হওয়ার সময় উল্লেখ করে না, সম্ভবত এটি শুরু থেকেই ছিল। চেঞ্জলগটি 1987
স্টাফেন চেজেলাস

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