SunOS 上的 Linux 上的“find”命令有其他替代方法吗?

SunOS 上的 Linux 上的“find”命令有其他替代方法吗?

与SunOS 或 Solaris 上的命令相比,Linux 上的命令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执行 a 操作lstat()以检索文件元数据(包括作为第 10 个元素的修改时间 ( $s[9])),在本地时区 ( localtime()) 中解释它并对其进行格式化 ( strftime()),然后将其print与文件名一起放置($_如果是,则为循环变量)中没有指定任何内容perl,并且$!相当于stderror(errno)上次系统调用失败的错误文本)。

答案2

另一种方法是使用脚本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

相关内容