Вопрос Как изменить дату, измененную / созданную из файла?


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


192
2017-09-22 05:32


происхождения




ответы:


Вы можете изменить время изменения файла, используя 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 не отслеживают это значение. Eсть ctime связанный с файлами, но он отслеживает, когда метаданные файла были изменены в последний раз. Если файл никогда не изменил свои права, возможно, это приведет к созданию времени создания, но это совпадение. Явное изменение времени изменения файла считается изменением метаданных, поэтому также будет иметь побочный эффект обновления ctime,


260
2017-09-22 06:34



Чтобы упомянуть более простой случай, когда все файлы находятся в одной папке: touch -d "2 hours ago" /path/*.txt, например. - enzotib
Я также добавлю, что изменение ctime невозможно любым стандартным способом. - arrange
Это все POSIX? - user1011471
Информация о ctime поскольку время изменения метаданных происходит от POSIX. Я не знаю, будут ли фрагменты оболочки в моем ответе работать со строгими утилитами оболочки POSIX. Но они определенно работают на Ubuntu, что является контекстом для ответов на этом сайте. - James Henstridge
touch: illegal option -- d - User


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

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

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

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

Заметка:  Вы можете изменить «201203101513»

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

Посмотреть мою страницу


40
2018-03-10 14:21



он не работает должным образом, если имя файла содержит пробелы - Angel


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

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

Видеть: коснуться человека


22
2017-12-19 14:58



Я попытался проверить его с помощью stat, но ни один из touch флаги приводят к правильному результату. Дата изменения корректируется, но изменения и доступ к дате фактически изменены на СЕЙЧАС - Xerus


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

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

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

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'

6
2017-12-17 14:52





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

#!/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
2017-08-06 19:40



Корректировка даты изображений на основе метаинформации на изображении будет очень полезна. Идентификатор ImageMagick можно использовать. например 'define -verbose <image> | grep -i date', 'ident -format% [exif: DateTime] <изображение>' может показывать '2015: 01: 08 10:19:10' (не все изображения имеют exif-данные) , Это работает (с помощью sed для конвертирования даты в формат касания можно обрабатывать): 'touch -d $ (define -format% [exif: DateTime] $ f | sed -r' /: / - /; s /: / - / ; ') $ f' - gaoithe


Прошло много времени с тех пор, как я написал какую-либо программу 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

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


1
2018-01-04 23:28



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


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


-6
2017-11-28 08:37



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