Обновленный ответ

Обновленный ответ

Это звучит как легко исследуемый вопрос. Это не так. Я следую следующему настоятельно рекомендуемому посту на сайте Ubuntu Stack Exchange, на который я случайно наткнулся. Но предложение не работает в Red Hat Enterprise Linux ES release 4. Я ожидал, что оно будет работать, но оно не работает, как описано ниже.

Этопредположение: В частности, постер рекомендует

Если вы хотите изменить файл относительно его текущего времени модификации, выполните следующие действия:

touch -d "$(дата -R -r имя_файла) - 2 часа" имя_файла

Это не работает у меня под Redhat. Знак минус игнорируется, и время переводится на два дня вперед, как будто я ввел

touch -d "$(date -R -r filename) + 2 hours" filename

Например:

$ ls -al test
-rw-r-----  1 sc1478 dev 5 Oct 27 12:59 test

$ touch -d "$(date -R -r test) - 8 days" test

$ ls -al test
-rw-r-----  1 sc1478 dev 5 Nov  4  2016 test

$ touch -d "$(date -R -r test) + 8 days" test

$ ls -al test 
-rw-r-----  1 sc1478 dev 5 Nov 12  2016 test

Независимо от того, использую ли я знак «минус» или «плюс», дата сдвигается вперед.

Это ошибка в какой-то версии Touch?

Есть ли другой способ скорректировать временную метку файла относительно его текущей временной метки?

решение1

Обновленный ответ

Я наткнулся на эту жемчужину

touch -r filename -d '+8 days' filename

Из info coreutils touch invocation(Спасибо @don_crissti):

'-r ФАЙЛ'

'--reference=ФАЙЛ'

 Use the times of the reference FILE instead of the current time.
 If this option is combined with the '--date=TIME' ('-d TIME')
 option, the reference FILE's time is the origin for any relative
 TIMEs given, but is otherwise ignored.  For example, '-r foo -d
 '-5 seconds'' specifies a time stamp equal to five seconds before
 the corresponding time stamp for 'foo'.  If FILE is a symbolic
 link, the reference timestamp is taken from the target of the
 symlink, unless '-h' was also in effect.

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

DAYS=8
touch -r filename -d "+${DAYS} days" filename

Образец:

$ ls -l foo.bar
-rw-r--r-- 1 usr usr 69414810 Nov 10  2016 foo.bar
$ TEST=100
$ touch -r foo.bar -d "+${TEST} days" foo.bar
$ ls -l foo.bar 
-rw-r--r-- 1 usr usr 69414810 Feb 24  2017 foo.bar

Связанный контент