มีทางเลือกอื่นสำหรับคำสั่ง `find 'บน linux สำหรับ SunOS หรือไม่?


10

findคำสั่งบนลินุกซ์มีตัวเลือกมากเมื่อเทียบกับfindคำสั่งบน SunOS หรือ Solaris

ฉันต้องการใช้findคำสั่งเช่นนี้:

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

มันทำงานได้ดีอย่างสมบูรณ์บนเครื่อง Linux แต่คำสั่งเดียวกันไม่มีตัวเลือก-printfในเครื่อง SunOS ฉันต้องการปรับแต่งผลงานของฉันใน"%TY-%Tm-%Td %f\n"รูปแบบ

โปรดแนะนำทางเลือกใด ๆ สำหรับ SunOS


5
ในการใช้ GNU findบน Solaris ให้ติดตั้งแพ็คเกจfindutils
Kusalananda

คำตอบ:


21

โปรดทราบว่ามันไม่มีส่วนเกี่ยวข้องกับ Linux; ว่ากริยาเป็นเฉพาะกับการดำเนินงานของกนู-printf findLinux ไม่ใช่ระบบปฏิบัติการมันเป็นเพียงเคอร์เนลที่พบในระบบปฏิบัติการจำนวนมาก ในขณะที่ระบบปฏิบัติการเหล่านั้นส่วนใหญ่เคยใช้ผู้ใช้ GNU ในอดีต แต่ปัจจุบันระบบปฏิบัติการส่วนใหญ่ที่ใช้ Linux นั้นฝังอยู่และมีคำสั่งพื้นฐานหากมี

findคำสั่งGNU ซึ่งติดตั้งลีนุกซ์ล่วงหน้าสามารถติดตั้งได้บนระบบปฏิบัติการ Unix ที่มีลักษณะคล้ายกันมากที่สุด แน่นอนว่ามันใช้กับ Solaris (เรียกว่า SunOS ก่อนหน้านี้) ก่อนที่ Linux จะออกมา

ทุกวันนี้มันยังมีอยู่ในแพ็คเกจ Oracle สำหรับ Solaris บน Solaris 11 นั้นอยู่ในfile/gnu-findutilsนั้นและมีการตั้งชื่อคำสั่งgfind(สำหรับ GNU 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(Solaris การดำเนินงาน) เพื่อหาไฟล์ แต่เรากำลังใช้มันกริยาที่จะผ่านรายการของไฟล์ที่จะ-exec perlและperlทำการเปิดlstat()แต่ละครั้งเพื่อดึงข้อมูลเมตาของไฟล์ (รวมถึงเวลาการแก้ไขเป็นองค์ประกอบที่ 10 ( $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 จะถูกตำหนิที่นี่ นอกจากนี้โปรดทราบว่าข้อมูลจำเพาะ POSIX ไม่เปิดเผยต่อสาธารณชนจนถึงยุค 2000 ฉันยังคงโทษคน GNU ที่แนะนำพวกเขาstatมากกว่าทศวรรษต่อมาด้วยไวยากรณ์ที่แตกต่างและด้อยกว่าสำหรับการกำหนดรูปแบบ
Stéphane Chazelas

คุณสามารถพูดถึงเมื่อ GNU พบว่าเพิ่มคุณสมบัตินั้นได้หรือไม่ ตั้งแต่ Solaris pax รองรับโหมดรายการนี้ตั้งแต่ปี 1998 ฉันคิดว่ามันได้รับการแนะนำกับ SUSv2
schily

1
นอกจากนี้คุณยังสามารถติดตั้ง gnu find ในไดเรกทอรี bin ของคุณเองและตั้งค่าพา ธ เพื่อค้นหาสิ่งนั้นก่อนหน้าไดเรกทอรี canonical
Peter - Reinstate Monica

@ schily รุ่นแรกสุดของ GNU พบฉันมี 3.1 จาก 1991 มันมี -printf (3.1 เพิ่มคำสั่งฟอร์แมต% k) การเปลี่ยนแปลงไม่ได้พูดถึงเมื่อมีการเพิ่มอาจเป็นจากจุดเริ่มต้น ChangeLog ย้อนกลับไปในปี 1987
Stéphane Chazelas

0

อีกวิธีในการเข้าใกล้ก็คือfind2perlสคริปต์ซึ่งแปลง (ที่นี่ชุดย่อย) ของfindคำสั่งให้เป็นสคริปต์ Perl ที่สอดคล้องกัน สคริปต์ perl ใช้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.