SunOS 기반 Linux에서 "find" 명령에 대한 대안이 있습니까?

SunOS 기반 Linux에서 "find" 명령에 대한 대안이 있습니까?

Linux의 명령에는 SunOS 또는 Solaris의 명령보다 더 많은 옵션이 있습니다 find.find

find다음과 같은 명령을 사용하고 싶습니다 .

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

-printfLinux 시스템에서는 잘 실행되지만 SunOS 시스템에서는 동일한 명령에 해당 옵션이 없습니다. 형식으로 출력을 사용자 정의하고 싶습니다 "%TY-%Tm-%Td %f\n".

SunOS에 대한 대안을 제안해 주십시오.

답변1

이는 Linux와 아무 관련이 없습니다. 이 -printf술어는 GNU 구현에만 해당됩니다 find. Linux는 운영 체제가 아니며 많은 운영 체제 내의 커널일 뿐입니다. 대부분의 운영 체제는 GNU 사용자 영역을 사용했지만 이제 Linux를 사용하는 대부분의 운영 체제는 내장되어 있으며 기본 명령(있는 경우)이 있습니다.

GNU find명령은 Linux 이전 버전이며 대부분의 Unix 계열 운영 체제에 설치할 수 있습니다. Linux가 등장하기 전에는 확실히 Solaris(당시 SunOS로 알려짐)에서 사용되었습니다.

현재는 Solaris용 Oracle 패키지로도 제공됩니다. 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).

답변2

find2perl또 다른 접근 방식은 명령(여기서는 하위 집합)을 해당 Perl 스크립트로 변환하는 스크립트를 사용하는 것입니다 find. Perl 스크립트는 모듈을 사용하여 File::Find무거운 작업을 수행합니다. 내 시스템의 find2perl 스크립트가 predicates 를 지원하지 않았기 때문에 -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

관련 정보