С GNU find
(, возможно, доступным как gfind
в вашей системе):
find. -mindepth 1 -maxdepth 1 -printf '%-58P %TF %AF\n'
Напечатает имя файла, дату последнего изменения (дату создания содержимого файла, если хотите )и дату последнего доступа в формате ГГГГ -мм -дд.
Чтобы ограничить до .txt
и .bkp
файлов, к которым не обращались в течение последних 365 дней:
find. -mindepth 1 -maxdepth 1 \
\( -name '*.txt' -o -name '*.bkp' \) \
-atime +364 -printf '%-58P %TF %AF\n'
Столбцы должны быть выровнены до тех пор, пока имена файлов не содержат управляющих или многобайтовых -или нулевых символов -ширины или символов двойной ширины -и не длиннее 58 байтов.
Первый столбец выравнивается по левому краю -, третий выравнивается по правому краю (при условии, что ширина терминала составляет 80 столбцов ), второй столбец смещается вправо, чтобы оставить место для имен файлов. Отрегулируйте ширину имени файла и интервал, если вы действительно хотите, чтобы оно было по центру.
Обратите внимание, что список файлов не отсортирован.
С ast -открытымls
(или ls
встроенным в ksh93, если он собран с ним):
ls -AZ '%-58(name)Ls %(mtime:%F)s %(atime:%F)s'
Следует сохранить выравнивание для символов с несколькими -байтами, нулевой -шириной и двойной -шириной и отсортировать список.
Сzsh
:
#! /bin/zsh -
zmodload zsh/stat
for f (*(DN)) {
stat -LH s -F %F -- $f &&
printf '%-58s %s %s\n' $f $s[mtime] $s[atime]
}
Чтобы ограничить файлы .txt
и .bkp
, к которым не обращались в течение последних 365 дней, замените *(DN)
на *.(txt|bkp)(DNa+364)
.
Следует сохранить выравнивание для многобайтовых -символов и отсортировать имена файлов.
Поскольку не существует стандартной команды для получения времени модификации и доступа надежным и переносимым способом, как обычно, лучше всего использоватьperl
:
perl -MPOSIX -Mlocale -Mopen=locale -MEncode::Locale -MEncode -e '
opendir D, "." || die "open.: $!\n";
for (
sort {$a->[1] cmp $b->[1]}
map {[$_, decode(locale => $_)]}
grep {!/^\.{1,2}\z/}
readdir D
) {
if (@s = lstat$_->[0]) {
printf("%-58s %s %s\n", $_->[1],
map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
} else {warn "$_: $!\n"}
}'
Как и в подходе zsh
, он должен сохранять выравнивание для многобайтовых -символов и сортировать имена файлов в соответствии с локальным порядком сортировки.
Поскольку Solaris 10 поставляется с древней версией perl
,возможно, вам придется отказаться от поддержки символов ASCII, отличных от -, в именах файлов, что упростило бы его до:
perl -MPOSIX -e '
opendir D, "." || die "open.: $!\n";
for (sort grep {!/^\.{1,2}\z/} readdir D) {
if (@s = lstat$_) {
printf("%-58s %s %s\n", $_,
map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
} else {warn "$_: $!\n"}
}'
Чтобы ограничить файлы .txt
и .bkp
, к которым не обращались в течение последних 365 дней, замените !/^\.{1,2}\z/
на/\.(txt|bkp)\z/ && -A > 365
Причина, по которой вы должны запускать две отдельные команды, согласно исходному коду passwd в:
https://pagure.io/passwd/blob/master/f/passwd.c
Является ли то, что истечение срока действия пароля всегда будет проверяться перед флагом --стандартного ввода, и будет вызывать возврат основной функции, что по существу означает выход из программы в этом случае.
if (passwd_flags & PASSWD_EXPIRE) {
printf(_("Expiring password for user %s.\n"), username);
retval = pwdb_update_aging(username, -2, -2, -2, -2, 0);
printf("%s: %s\n", progname,
retval ==
0 ? _("Success") : _("Error"));
audit_log_acct_message(audit_fd, AUDIT_USER_MGMT,
NULL, "expired-password", NULL, pwd->pw_uid,
NULL, NULL, NULL, retval == 0);
return retval;
}
Фактический синтаксический анализ параметров строки команды -происходит до этой точки, поэтому порядок не имеет значения, флаг истечения срока действия всегда будет учитываться перед флагом --stdin в этой версии passwd.
Это существенно означает, что вам всегда придется запускать passwd -e <username>
и passwd <username>
как отдельные команды, поскольку логически невозможно выполнить и истечение срока действия, и смену пароля в рамках одного синтаксиса команды.