Получить список каталогов и метку времени в определенном формате в HP-UX

Я работаю на HP-UX B.11.11 OS. Мое требование – отображать только список каталогов, а последний измененный формат времени должен быть ДД-МЕС-ГГГГ ЧЧ: МИ: СС AM / PM Я могу получить список, используя либо

ls -lF | grep / 

ИЛИ ЖЕ

  ls -ld -- */ 

но я не могу установить формат времени так, как хочу. Параметр –full-time или –time-style не работает в HP-UX, и HP-UX также не имеет stat .

Вопросы:

  1. Основное требование: Может ли кто-нибудь предоставить мне сценарий для отображения списка всех имен каталогов (не файлов) в текущем каталоге и последней измененной отметки времени в указанном выше формате? Мне не нужно имя владельца, имя группы, размер, разрешения и т. Д.

  2. Есть ли другой способ отобразить эту информацию без использования C или Perl, просто используя стандартные команды и параметры?

  3. Мне было интересно, как WinSCP может отображать полный формат даты / времени в пользовательском интерфейсе? Кто-нибудь знает, какую команду он использует для отображения содержимого каталога в пользовательском интерфейсе?

Любая помощь приветствуется. Благодарю.

ОБНОВЛЕНИЕ (редактируется только ниже):
Таким образом, ответ Стефана Шазеласа со сценарием Perl сработал отлично. Сейчас я пытаюсь преобразовать его в сценарий оболочки, но я получаю ошибки при его выполнении. Я сохранил скрипт оболочки dir_list.sh в /dev/scripts/ . Не могли бы вы помочь, где я иду не так?

 #!/usr/bin/sh # dir_list.sh : Generate a comma separated directory list with last modified timestamp # Navigate to the directory where listing is required cd /dev/product/jobs # Execute Perl script /usr/bin/perl -MPOSIX -MFcntl -MFile::stat -le ' setlocale(LC_TIME, "C"); for () { $s = lstat $_ or die "$_: $!\n"; print "$_," . uc(strftime("%d-%b-%Y %I:%M:%S %p", localtime $s->mtime)) if S_ISDIR($s->mode) }' exit 0 

СООБЩЕНИЕ ОБ ОШИБКЕ
Обратите внимание, что я пробовал также #!/usr/bin/sh , но это не удалось с тем же сообщением об ошибке: interpreter "/usr/bin/sh" not found

 $ ./dir_list.sh interpreter "/bin/sh" not found file link resolves to "/usr/bin/sh" ksh: ./dir_list.sh: not found 

Окончательное обновление: решено – решение ниже

Я создал сценарий оболочки Unix dir_list.sh который при вызове ( $ ./dir_list.sh ) выполняет поиск в целевой папке, указанной в сценарии, и отображает имена папок вместе с соответствующей временной меткой в ​​виде записей через запятую

 #! /usr/bin/ksh # dir_list.sh : Generate a comma separated directory list with last modified timestamp # # Navigate to the Target Directory cd /dev/product/jobs || exit # # Execute Perl script to format the output /usr/bin/perl -MPOSIX -MFcntl -MFile::stat -le ' setlocale(LC_TIME, "C"); for () { $s = lstat $_ or die "$_: $!\n"; print "$_," . uc(strftime("%d-%b-%Y %I:%M:%S %p", localtime $s->mtime)) if S_ISDIR($s->mode) }' # exit 0 

Спасибо Стефану Шазеласу за всю вашу помощь! 🙂

Если не установлены утилиты GNU, вам лучше всего perl на этих традиционных системах:

 perl -MPOSIX -MFcntl -MFile::stat -le ' setlocale(LC_TIME, "C"); for (<*>) { $s = lstat $_ or die "$_: $!\n"; print "$_ " . uc(strftime("%d-%b-%Y %I:%M:%S %p", localtime $s->mtime)) if S_ISDIR($s->mode) }' 

Это интерфейс perl к стандартному системному вызову POSIX lstat() который извлекает метаданные файла и функцию strftime() для форматирования дат.

Подробности смотрите в perldoc POSIX , perldoc -f lstat , perldoc -f stat , man lstat , man strftime . Мы используем локаль C для LC_TIME поэтому мы получаем английские названия месяцев и PM / AM независимо от предпочтений пользователя.

Если zsh установлен:

 zsh -c 'zmodload zsh/stat LC_ALL=C stat -nA times -LF "%d-%b-%Y %I:%M:%S %p" +mtime -- *(/) && for ft ($times) printf "%s\n" "$f: ${(U)t}"' 

Выше мы используем perluc() и zsh${(U)var} для преобразования временных меток в верхний регистр. В системах GNU вы могли использовать %^b для сокращения месяца в верхнем регистре, но это не похоже на то, что оно доступно в HP / UX.

находить . -тип d -exec stat {} \; это обычный способ Unix System V. Похоже, что stat становится fstat в HP-UX, поэтому команда становится find. -тип d -exec fstat {} \;

В зависимости от ваших требований, вам может потребоваться передать вывод в awk (или nawk или gawk), чтобы получить именно то, что вы ожидаете.

Ссылка: http://hpux.connect.org.uk/hppd/hpux/Shells/fstat-1.0/man.html.