SunOSベースのLinuxで「find」コマンドに代わるものはありますか?

SunOSベースのLinuxで「find」コマンドに代わるものはありますか?

Linuxのコマンドには、SunOSまたはSolarisのコマンドよりも多くのオプションがありますfindfind

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を使用するほとんどのオペレーティングシステムは組み込まれており、基本的なコマンド(存在する場合)があります。

GNUfindコマンドは 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

関連情報