Эти коды в основном предназначены для ANSI.SYS , расширение DOS. Эквивалент для BASH - перепривязать ключи через строку чтения. См. Справочную страницу bash (1)
, раздел READLINE .
Обратите внимание, что это не имеет ничего общего с 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()
), который затем print
s рядом с именем файла($_
— это переменная цикла, если она не указана в perl
, а $!
эквивалентно stderror(errno)
— тексту ошибки для последнего сбоя системного вызова ).
Другой способ приблизиться к этому — использовать скрипт 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