SunOS için linux'da 'find` komutuna alternatif var mı?


10

findLinux üzerinde komut ile karşılaştırıldığında seçenekleri bir yeri vardır findsunOS veya Solaris üzerinde komuta.

findKomutu şu şekilde kullanmak istiyorum:

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

Bir Linux makinesinde mükemmel çalışır, ancak aynı komutun -printfSunOS makinesinde seçeneği yoktur . Çıktımı "%TY-%Tm-%Td %f\n"formatta özelleştirmek istiyorum .

Lütfen SunOS için herhangi bir alternatif önerin.


5
findSolaris'te GNU kullanmak için findutils paketini yükleyin .
Kusalananda

Yanıtlar:


21

Linux ile ilgisi olmadığını unutmayın; bu -printfyüklemin GNU uygulamasına özgüdür find. Linux bir işletim sistemi değil, sadece birkaç işletim sisteminde bulunan çekirdek. Bu işletim sistemlerinin çoğu geçmişte bir GNU kullanıcısı kullanıyordu, şimdi Linux kullanan işletim sistemlerinin büyük çoğunluğu gömülü ve eğer varsa temel komutları var.

findLinux'tan önceki GNU komutu, Unix benzeri işletim sistemlerinin çoğuna yüklenebilir. Linux çıkmadan önce kesinlikle Solaris'te (o zaman SunOS olarak adlandırıldı) kullanıldı.

Günümüzde Solaris için bir Oracle paketi olarak bile mevcut. Solaris 11'de buna dahildir file/gnu-findutilsve komut adlandırılır gfind(GNU findiçin, sistemi kendi findkomutundan ayırmak için ).

Şimdi, paketleri yükleyemiyorsanız, en iyi bahsiniz muhtemelen aşağıdakileri kullanmaktır 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

Burada hala finddosyaları bulmak için (Solaris uygulaması) kullanıyoruz , ancak -execdosya listesini aktarmak için yüklemini kullanıyoruz perl. Ve perlbir yok lstat()her biri üzerinde (10 elemanı (aynı modifikasyon süresi dahil dosya meta verileri almak $s[9])), yerel saat diliminde (içinde yorumlayıp onu localtime()) ve biçimleri o ( strftime()o zaman) printdosya adının yanında s ( $_döngü değişkeni ise bir none, son sistem çağrısı hatası için hata metninde belirtilir perlve $!eşdeğeridir stderror(errno)).


Geliştirmeleri uygulamadan önce GNU çalışanlarının mevcut standartlara bakması hoş olmaz mıydı? Yazımls çıktısını belirtmek için bir biçimin nasıl kullanılacağına dair bir standart zaten var , bkz. Pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html
şil

5
@schily, GNU find'nun POSIX.2'den -printfönce geldiğinden POSIX çalışanları burada suçlanacak. POSIX spesifikasyonunun 2000'li yıllara kadar herkese açık olmadığını da unutmayın. GNU milletlerini staton yıldan fazla bir süre sonra, format spesifikasyonu için farklı ve daha düşük bir sözdizimi ile tanıttıkları için hala suçluyorum .
Stéphane Chazelas

GNU bulmasının bu özelliği ne zaman eklediğinden bahseder misiniz? Solaris pax 1998'den beri bu liste modunu desteklediğinden, sanırım SUSv2 ile tanıtıldı.
schily

1
Ayrıca kendi bin dizininize bir gnu bulup kurabilir ve kurallı dizinlerden önce arama yolunu ayarlayabilirsiniz.
Peter - Monica'yı

@schily, sahip olduğum GNU bulmanın en eski sürümü 1991'den 3.1, zaten -printf (3.1% k format yönergesini ekledi) vardı, changelog eklendiğinde bahsetmiyor, muhtemelen en başından beri oradaydı. ChangeLog
1987'e

0

Buna yaklaşmanın başka bir yolu find2perl, bir findkomutun (burada bir altkümeyi) karşılık gelen perl komut dosyasına dönüştüren betiktir. Perl betiği File::Find, ağır kaldırmayı yapmak için bir modül kullanır . Sistemimdeki find2perl betiği -printfyüklemi desteklemediğinden, manuel olarak ekledim:

#! /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;

Oluşturduğum iki örnek dosyada çıktı aynı:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.