如何将输出从stat传递到touch



我在运行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

请记住,设置时间的行为会更改上次更改的时间,因此,如果您修改了目录并希望将目录的日期推迟以避免被检测到,则不能使用此技术来覆盖您的轨迹。

相关内容

  • 没有找到相关文章

最新更新