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

196

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

задан snej 22.09.2011 в 05:32
источник

7 ответов

263

Вы можете изменить время модификации файла с помощью команды 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 .

    
ответ дан James Henstridge 22.09.2011 в 06:34
40

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

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

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

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

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

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

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

    
ответ дан EFL 10.03.2012 в 14:21
22

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

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 19.12.2015 в 14:58
7

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' '{}'
    
ответ дан Xen2050 17.12.2016 в 14:52
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
    
ответ дан joakim 06.08.2013 в 19:40
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 04.01.2015 в 23:28
-6

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

    
ответ дан vampiremac 28.11.2012 в 08:37

Ознакомьтесь с другими вопросами по меткам