假設您需要生成帶NUL時間戳的檔案名的 -delimited 流。
在 Linux 和 Solaris 上,我可以這樣做:
stat --printf '%.9Y %n\0' -- *
在 BSD 上,我可以獲得相同的資訊,盡管由換行符分隔,但具有:
stat -f '%.9Fm %N' -- *
man討論了一些轉義序列,但似乎NUL不支持位元組:
如果
%緊跟在 、 、 或 之一之后n,t則%列印@一個newline字符、一個tab字符、一個percent字符或當前檔案編號。
有沒有辦法解決這個問題?
uj5u.com熱心網友回復:
不幸stat的是,開箱即用不提供此選項,因此您的要求無法直接實作。
但是,您可以使用 Perl 或 Python 等腳本語言輕松實作所需的功能。
#!/usr/bin/env python3
from pathlib import Path
from sys import argv
for arg in argv[1:]:
print(
Path(arg).stat().st_mtime,
arg, end="\0")
演示:https ://ideone.com/vXiSPY
該演示在 mtime 中顯示出一個小差異,這似乎不是舍入錯誤,但在 MacOS 上結果可能會有所不同(演示平臺顯然是 Debian Linux)。如果您想將結果強制為特定的小數位數,Python 具有類似于stat和的格式化工具printf。
uj5u.com熱心網友回復:
對于任何不能產生 NUL 終止(或任何其他字符/字串終止)輸出的命令,您可以將其包裝在一個函式中以呼叫該命令,然后printf使用終止 NUL 而不是換行符輸出,例如:
nulstat() {
local fmt=$1 file
shift
for file in "$@"; do
printf '%s\0' "$(stat -f "$fmt" "$file")"
done
}
nulstat '%.9Fm %N' *
例如:
$ > foo
$ > $'foo\nbar'
$ nulstat '%.9Fm %N' foo* | od -c
0000000 1 6 6 3 1 6 2 5 3 6 . 4 7 7 9 8
0000020 0 1 4 0 f o o \0 1 6 6 3 1 6 2
0000040 5 3 9 . 3 8 8 0 6 9 9 3 0 f o
0000060 o \n b a r \0
0000066
uj5u.com熱心網友回復:
您可以嘗試這個變通解決方案:
stat -nf "%.9Fm %N/" * | tr / '\0'
這里:
-n:抑制stat輸出中的換行符- 添加
/為stat輸出中每個條目的終止符 tr / '\0': 轉換/成 NUL 位元組
uj5u.com熱心網友回復:
有沒有辦法解決這個問題?
如果您只需要用 NULL 替換所有換行符,那么以下tr就足夠了
stat -f '%.9Fm %N' * | tr '\n' '\000'
說明:000表示NULL為八進制值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507862.html
