web-dev-qa-db-ja.com

HP-UXで特定の形式のディレクトリとタイムスタンプのリストを取得する

HP-UX B.11.11OSを使用しています。私の要件はディレクトリのリストのみを表示することであり、最後に変更された時刻形式はDD-MON-YYYY HH:MI:SS AM/PMである必要があります。どちらかを使ってリストを取得できます

    ls -lF | grep /

OR

    ls -ld -- */

しかし、時間形式を希望どおりに設定できません。 -full-timeまたは-time-styleパラメーターはHP-UXでは機能しません。HP-UXにはstatもありません。

質問:

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

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

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

どんな助けでも大歓迎です。ありがとう。

更新(以下の編集のみ):
したがって、Perlスクリプトを使用したStéphaneChazelasの回答は完全に機能しました。現在、シェルスクリプトに変換しようとしていますが、実行中にエラーが発生します。シェルスクリプトを保存しましたdir_list.shunder/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

おかげでステファンChazelasすべてのあなたの助けを! :)

4
NiCKz

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)
  }'
_

これは、ファイルメタデータとlstat()関数を取得して日付をフォーマットする標準のPOSIXstrftime()システムコールへのPerlのインターフェイスです。

詳細については、_perldoc POSIX_、_perldoc -f lstat_、_perldoc -f stat_、_man lstat_、_man strftime_を参照してください。 _LC_TIME_にはCロケールを使用するため、ユーザーの設定に関係なく、英語の月名とPM/AMを取得します。

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}"'
_

上記では、タイムスタンプを大文字に変換するために、Perluc()zsh${(U)var}を使用しています。 GNUシステムでは、大文字の月の省略形に_%^b_を使用することもできますが、HP/UXで使用できるようには見えません。

3

検索。 -type d -exec stat {} \;は、通常のUnix SystemVの方法です。 HP-UXではstatfstatになるようですので、コマンドfindになります。 -type d -exec fstat {} \;

要件によっては、期待どおりの結果を得るには、出力をawk(またはnawkまたはgawk)にパイプする必要がある場合があります。

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

0
ypouplard