Как я могу передать вывод от stat на ощупь? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть скрипт оболочки korn на сервере, работающем под управлением SunOS 5.9, и мне нужно передать выходные данные из 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 ошибку.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Это будет делать то, что вы хотите (по крайней мере, на моем компьютере с Linux):

MTIME=$( stat now.txt | grep '^Modify:' | awk '{ print $2" "$3 }')
touch --date "$MTIME" now.txt

В качестве альтернативы, если у вас нет доступа к сенсорному Linux (но у вас есть дата 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, вам нужно будет собрать временную метку из вывода статистики с чем-то вроде:

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

Имейте в виду, что установка времени изменяет время последнего изменения, поэтому вы не можете использовать эту технику для покрытия своих треков, если вы измените каталог и надеетесь установить дату в каталоге, чтобы избежать обнаружения.

0 голосов
/ 20 декабря 2018

вы можете использовать это:

mtime=$(stat -c %Y  ${dirvar})
touch -d "@${mtime}" "${dirvar}"

Это использует метку времени Unix вместо удобочитаемой даты, но некоторые утилиты Linux принимают это.

0 голосов
/ 19 декабря 2018

Я никогда не использовал stat -t, но на странице руководства написано:

   -t STAMP
          use [[CC]YY]MMDDhhmm[.ss] instead of current time

Это означает, что вы можете попробовать его, используя этот формат: 201812191128.41

...