Являются там какими-либо альтернативами команде 'находки' на Linux для SunOS?

Эти коды в основном предназначены для ANSI.SYS , расширение DOS. Эквивалент для BASH - перепривязать ключи через строку чтения. См. Справочную страницу bash (1) , раздел READLINE .

10
20.06.2018, 14:07
2 ответа

Обратите внимание, что это не имеет ничего общего с Linux; этот предикат -printfспецифичен для реализации GNU find. Linux - это не ОС, это просто ядро, которое есть в ряде ОС. Хотя в прошлом большинство этих ОС использовали пользовательскую среду GNU, теперь подавляющее большинство ОС, использующих Linux, являются встроенными и имеют базовые команды, если они есть.

Команду GNU find, предшествовавшую Linux, можно установить на большинство Unix -подобных операционных систем. Он определенно использовался в Solaris (под названием SunOS тогда )до выхода Linux.

В настоящее время он доступен даже в виде пакета Oracle для Solaris. В 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()), который затем prints рядом с именем файла($_— это переменная цикла, если она не указана в perl, а $!эквивалентно stderror(errno)— тексту ошибки для последнего сбоя системного вызова ).

21
27.01.2020, 20:00

Другой способ приблизиться к этому — использовать скрипт 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
0
27.01.2020, 20:00

Теги

Похожие вопросы