最終更新:解決済み - 回避策は次のとおりです。

最終更新:解決済み - 回避策は次のとおりです。

HP-UX B.11.11オペレーティングシステムを使用しています。私のもの必要ディレクトリのリストのみが表示され、最後に変更された時刻形式は次のようになります。日-月-年 HH:MI:SS AM/PM。次のいずれかの方法でリストを取得できます

    ls -lF | grep /

または

    ls -ld -- */

ただし、必要に応じて時間形式を指定することはできません。これ- フルタイムまたは--時間スタイルパラメータはHP-UXに影響を与えず、HP-UXにも影響しません。統計資料しかも。

質問:

  1. 主な要件:誰もが上記の形式の最後の修正タイムスタンプで現在のディレクトリの下にあるすべてのディレクトリ名(ファイルではない)のリストを表示するスクリプトを提供できますか?所有者名、グループ名、サイズ、権限などは必要ありません。

  2. CやPerlを使用せずに標準コマンドとパラメータのみを使用してこの情報を表示する他の方法はありますか?

  3. WinSCPがUIに完全な日付/時刻形式を表示する方法を知りたいです。 UIにディレクトリの内容を表示するために内部的にどのコマンドを使用するかを知っている人はいますか?

助けてくれてありがとう。ありがとうございます。

更新(次の項目のみ編集):
したがって、Perlスクリプトを使用したStéphane Chazelasの答えは非常にうまく機能します。これでシェルスクリプトに変換しようとしましたが、実行中にエラーが発生します。シェルスクリプトを保存しました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

最終更新:解決済み - 回避策は次のとおりです。

dir_list.sh()を呼び出すと、$ ./dir_list.shスクリプトで指定されたターゲットフォルダを検索し、フォルダ名と関連するタイムスタンプをカンマ区切りのレコードとして表示するUnixシェルスクリプトを作成しました。

#! /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)
  }'

これは、ファイルメタデータを取得して日付をフォーマットするために使用される機能である標準のperlPOSIXシステムコールへのインタフェースです。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'uc()zsh'を使用して${(U)var}タイムスタンプを大文字に変換しました。 GNUシステムでは、すべて大文字の月の略語を使用できますが、%^bHP / UXでは使用できないようです。

おすすめ記事