Как я могу изменить дату изменения / создания файла?

234

Есть ли способ изменить дату, когда файл был изменен / создан (который отображается в Nautilus или с помощью команды ls -l)? В идеале я ищу команду, которая может изменить метки даты / времени целой пачки файлов на определенное количество времени раньше или позже (например, +8 часов или -4 дня и т. Д.).

snej
источник

Ответы:

324

Пока вы являетесь владельцем файла (или root), вы можете изменить время модификации файла, используя touchкоманду:

touch filename

По умолчанию это установит время модификации файла на текущее время, но есть несколько флагов, например, -dфлаг для выбора конкретной даты. Так, например, чтобы установить файл как изменяемый за два часа до настоящего, вы можете использовать следующее:

touch -d "2 hours ago" filename

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

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

Если вы хотите изменить большое количество файлов, вы можете использовать следующее:

find DIRECTORY -print | while read filename; do
    # do whatever you want with the file
    touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done

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

find DIRECTORY -exec touch -d "2 hours ago" {} +

Эта форма невозможна для относительной версии времени файла, потому что она использует оболочку для формирования аргументов touch.

Что касается времени создания, большинство файловых систем Linux не отслеживают это значение. Существует ctimeсвязь с файлами, но она отслеживает время последнего изменения метаданных файла. Если права доступа к файлу никогда не меняются, может случиться так, что он задержит время создания, но это совпадение. Явное изменение времени изменения файла считается изменением метаданных, поэтому также имеет побочный эффект обновления ctime.

Джеймс Хенстридж
источник
Чтобы упомянуть более простой случай, когда все файлы находятся в одной папке: touch -d "2 hours ago" /path/*.txtнапример.
энзотиб
1
Я также добавил бы, что изменение ctimeстандартным способом невозможно.
организовать
Это все POSIX?
user1011471 10.09.15
1
Информация о ctimeвремени изменения метаданных взята из POSIX. Я не знаю, будут ли фрагменты оболочки в моем ответе работать со строгими утилитами оболочки POSIX. Но они определенно работают на Ubuntu, которая является контекстом для ответов на этом сайте.
Джеймс Хенстридж
1
На OSX вы можете использовать gtouchчерез brew install coreutils.
Нобу
46

Спасибо за помощь. Это сработало для меня:

В терминале перейдите в каталог для редактирования даты. Затем введите:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

Вы увидите ">" после того, как нажмете ввод, за исключением последнего раза -> "готово".

Примечание. Вы можете изменить «201203101513».

"201203101513" = это дата, которую вы хотите для всех файлов в этом каталоге.

Смотрите мою веб-страницу

EFL
источник
он не работает должным образом, если имя файла содержит пробелы
Angel
Веб-страницы больше нет, хотя и прошло 6 лет. Тем не менее, это ответ, который я искал. Для тех, кто хочет включить секунды в свое время, используйте .ssгде ss - количество секунд. (Примечание: это, похоже, не контролирует время подсекунды, такое как наносекунды или миллисекунды, которые для меня просто выглядели как нули; однако это различие было допустимо для моего варианта использования.)
Спенсер D
34

Самый простой способ - доступ и изменение будут одинаковыми:

touch -a -m -t 201512180130.09 fileName.ext

Где:

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format

Если вы хотите использовать, NOWпросто опустите -tи отметку времени.

Чтобы убедиться, что они все одинаковы: stat fileName.ext

Смотрите: сенсорный человек

Jadeye
источник
1
Я попытался проверить это, используя stat, но ни один из touchфлагов не привел к правильному результату. Дата модификации корректируется, но измененная и доступная дата фактически изменяется на СЕЙЧАС
Xerus
Это не сработало для меня, оно изменило только время «Изменение»
Revious
@Revious, Xerus Какая разница между changedвременем и modifiedвременными метками ?
Иосиф
9

Touch может ссылаться на дату файла самостоятельно, не нужно вызывать dateили использовать подстановку команд. Вот немного со страницы информации касания:

`-r FILE' `--reference=FILE'
     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.

Например, чтобы добавить 8 часов к дате файла (имя файла в fileкавычках на случай пробелов и т. Д.):

touch -r "file" -d '+8 hour' "file"

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

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done

Я слышал, что использование a *и возможность forвыбора имени файла безопаснее , но использование find -print0 | xargs -0 touch ... должно обрабатывать большинство сумасшедших символов, таких как символы новой строки, пробелы, кавычки, обратные слэши в имени файла. (PS. Старайтесь не использовать сумасшедшие символы в именах файлов в первую очередь).

Например, чтобы найти все файлы thatdir, имена файлов которых начинаются с символа «И» s, и добавить один день к измененной метке времени этого файла, используйте:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
Xen2050
источник
2

Этот маленький сценарий по крайней мере работает для меня

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done
Йоаким
источник
2
Корректировка даты изображений на основе метаинформации в изображении была бы довольно полезной. Идентификация ImageMagick может быть использована. например, «Identify -verbose <image> | grep -i date», «Identify -format% [exif: DateTime] <image>» может отображать «2015: 01: 08 10:19:10» (не все изображения имеют данные EXIF ). Это работает (с помощью sed для преобразования даты в формат touch можно обработать): 'touch -d $ (определить -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
1

Прошло много времени с тех пор, как я написал какую-либо программу для Unix, но я случайно неверно установил год на куче рождественских фотографий, и я знал, что если я не изменю дату с 2015 на 2014, это будет проблемой позже ,

Может быть, это простая задача, но я не нашел простого способа сделать это.

Я изменил сценарий, который нашел здесь, который первоначально использовался для изменения даты на минус один месяц.

Вот оригинальный скрипт:

#!/bin/bash

# find specific files
files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in ${files}
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v -1m -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Вот мой модифицированный скрипт, который принудительно назначил дату «2014»:

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch
 touch -t $(date -v +1y -r $(stat -f %m  "${f}") +2014%m%d%H%M.%S) "${f}"
done

Теперь я понимаю, что мог бы сделать более общую версию:

#!/bin/bash 

# find specific files
#files=$(find . -type f -name '*.JPG')

# use newline as file separator (handle spaces in filenames)
IFS=$'\n'

for f in $*
do
 # read file modification date using stat as seconds
 # adjust date backwards (1 month) using date and print in correct format 
 # change file time using touch (+1y adds a year "-1y" subtracts a year)
 # Below line subtracts a year
 touch -t $(date -v -1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
 # Below line adds a year
 # touch -t $(date -v +1y -r $(stat -f %m  "${f}") +%Y%m%d%H%M.%S) "${f}"
done

Чтобы использовать этот файл, вам нужно написать его и

chmod +x fn

выполнить:

./fn files-to-change

п = ваш-имя-файла-что-это-ваш-команда

пример

./fn *.JPG

изменит дату на минус один год в каталоге, где вы находитесь.

RickK
источник
1
То же, что выше комментарий. Большинство файлов .jpg имеют дату, встроенную в метаданные, добавленные камерой. Это работает (используя sed для преобразования даты в формат touch можно обработать): 'touch -d $ (определить -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
-6

просто измените дату и время в настройках. затем сохраните ваш файл, он автоматически изменится

vampiremac
источник
3
Снеж ищет пакетное решение или решение командной строки, которое можно использовать для изменения нескольких файлов. Изменение системного времени и даты и изменение файлов, вероятно, не идеальное решение.
fabricator4
слишком много triiiiiiicky !!!
Филипп Гачу
Для тех, у кого есть другие ОС, добавленные сюда через веб-поиск, этот ответ - самый простой способ изменить дату файла в Mac OSX («touch -d» приводит к «недопустимой опции»).
alanning
1
@alanning: OSX поддерживает BSD, а не GNU. Используйте -t. developer.apple.com/library/mac/documentation/Darwin/Reference/…
Доминик Р.
Это может иметь непредвиденные последствия. В современной ОС множество файлов постоянно модифицируется за кулисами. Хотя ваша дата изменяется, многие другие файлы могут иметь неправильные отметки даты, и может произойти что угодно, если что-то в системе заметит, что файл старше, чем ожидалось.
Джо