与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