Ls

在 HP-UX 中獲取特定格式的目錄和時間戳列表

  • November 26, 2018

我在 HP-UX B.11.11 作業系統上。我的要求是僅顯示目錄列表,最後修改時間格式應為DD-MON-YYYY HH:MI:SS AM/PM。我可以使用任何一個來獲取列表

   ls -lF | grep /

或者

   ls -ld -- */

但我無法根據需要設置時間格式。–full-time或–time -style參數在 HP-UX 中不起作用,並且 HP-UX 也沒有stat

問題:

  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

感謝Stéphane Chazelas的所有幫助!:)

除非安裝了 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標準 POSIXlstat()系統呼叫的介面,用於檢索文件元數據和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 f t ($times) printf "%s\n" "$f: ${(U)t}"'

上面,我們使用perl’suc()zsh’s${(U)var}將時間戳轉換為大寫。在 GNU 系統上,您可以使用%^b全大寫的月份縮寫,但它看起來不像在 HP/UX 上可用。

引用自:https://unix.stackexchange.com/questions/449766