Это звучит как легко исследуемый вопрос. Это не так. Я следую следующему настоятельно рекомендуемому посту на сайте 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