我在运行SunOS 5.9的服务器上有一个korn-shell脚本,我需要将输出从stat
传递到touch
,以便在对目录执行某些操作后重置修改后的时间戳,例如
#Get modified timestamp of directory
mtime=$(stat -c %y ${dirvar})
## Do something to directory that will alter its modified timestamp ##
#Reset modified timestamp of directory
touch -t "${mtime}" "${dirvar}"
我该怎么做?上面的代码返回错误touch: bad time specification
我试过这个:
> stat -c %y ${dirvar} | awk '{ split($1, a, "-"); split($2, b, ":"); split(b[3], c, "."); print a[1]a[2]a[3]b[1]b[2]c[1]}'
这需要:
stat -c %y tmp
2018-12-19 11:28:41.000000000 +0000
并输出如下:
20181219112841
但我仍然得到相同的touch: bad time specification
错误。
我从未使用过stat -t
,但手册页上写着:
-t STAMP
use [[CC]YY]MMDDhhmm[.ss] instead of current time
这意味着,你可能想尝试使用以下格式:201812191128.41
您可以使用这个:
mtime=$(stat -c %Y ${dirvar})
touch -d "@${mtime}" "${dirvar}"
它使用unix时间戳而不是人类可读的日期,但一些linux实用程序接受这一点。
这将实现您想要的功能(至少在我的Linux机器上(:
MTIME=$( stat now.txt | grep '^Modify:' | awk '{ print $2" "$3 }')
touch --date "$MTIME" now.txt
或者,如果您无法访问Linux touch(但有GNU日期((在so
目录上操作(:
MTIME=$( stat so | grep '^Modify:' | awk '{ print $2" "$3 }')
TS=$( gdate --date "$MTIME" +%Y%m%d%H%M.%S )
touch -t $TS so
如果你不能访问GNU日期,你将不得不从stat的输出中组装时间戳,比如:
mtime=$( stat so | grep '^Modify:' | awk '{ print $2" "$3 }')
yy=$( echo $mtime | cut -f1 -d- )
MM=$( echo $mtime | cut -f2 -d- )
DD=$( echo $mtime | cut -f3 -d- | cut -f1 -d )
hhmmss=$(echo $mtime | awk '{ print $2 }' )
hh=$( echo $hhmmss | cut -f1 -d: )
mm=$( echo $hhmmss | cut -f2 -d: )
ss=$( echo $hhmmss | cut -f3 -d: | cut -f1 -d. )
echo ${yy}${MM}${DD}
echo ${hh}${mm}.${ss}
ts=${yy}${MM}${DD}${hh}${mm}.${ss}
touch -t $ts so
请记住,设置时间的行为会更改上次更改的时间,因此,如果您修改了目录并希望将目录的日期推迟以避免被检测到,则不能使用此技术来覆盖您的轨迹。