最终更新:已解决 - 解决方案如下

最终更新:已解决 - 解决方案如下

我使用的是 HP-UX B.11.11 操作系统。我的要求仅显示目录列表,最后修改时间格式应为日-月-年 HH:MI:SS 上午/下午。我可以使用以下任一方法获取列表

    ls -lF | grep /

或者

    ls -ld -- */

但我无法根据需要设置时间格式。这- 全职或者--时间风格参数在 HP-UX 中不起作用,并且 HP-UX 没有统计数据以及。

问题:

  1. 主要要求:谁能给我提供一个脚本来显示当前目录下所有目录名称(不是文件)的列表以及上述格式的最后修改时间戳?我不需要所有者名称、组名称、大小、权限等。

  2. 有没有其他方法可以在不使用 C 或 Perl 的情况下,仅使用标准命令和参数来显示此信息?

  3. 我想知道 WinSCP 如何在 UI 中显示完整的日期/时间格式?有人知道它内部使用什么命令在 UI 中显示目录内容吗?

任何帮助表示赞赏。谢谢。

更新(仅编辑以下内容):
因此,Stéphane Chazelas 使用 perl 脚本的回答非常有效。现在,我尝试将其转换为 shell 脚本,但在执行时遇到错误。我已经保存了shell脚本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 shell 脚本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

谢谢斯蒂芬·查泽拉斯感谢您的帮助! :)

答案1

除非安装了 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​我们使用 C 语言环境,以便获得英文月份名称和/而不管用户的偏好。perldoc -f statman lstatman strftimeLC_TIMEPMAM

如果zsh安装了:

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

上面,我们使用perl'suc()zsh's${(U)var}将时间戳转换为大写。在 GNU 系统上,您可以使用%^b全大写的月份缩写,但它看起来在 HP/UX 上不可用。

答案2

寻找 。 -type d -exec stat {} \;是通常的 Unix System V 方式。看起来统计数据变成统计数据在 HP-UX 上,因此命令变为 寻找 。 -type d -exec fstat {} \;

根据您的要求,您可能必须在 awk(或 nawk 或 gawk)中通过管道传输输出才能准确获得您所期望的结果。

参考:http://hpux.connect.org.uk/hppd/hpux/Shells/fstat-1.0/man.html

相关内容