在 HP-UX 中獲取特定格式的目錄和時間戳列表
我在 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。
問題:
- **主要要求:**誰能提供一個腳本來顯示目前目錄下所有目錄名(不是文件)的列表以及上述格式的最後修改時間戳?我不需要所有者名稱、組名、大小、權限等。
- 有沒有其他方法可以在不使用 C 或 Perl 的情況下僅使用標準命令和參數來顯示此資訊?
- 我想知道 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 上可用。