Linuxのコマンドには、SunOSまたはSolarisのコマンドよりも多くのオプションがありますfind
。find
find
次のコマンドを使用したいと思います。
find data/ -type f -name "temp*" -printf "%TY-%Tm-%Td %f\n" | sort -r
-printf
Linux システムではうまく動作しますが、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