Как я могу изменить дату изменения / создания файла?
Есть ли способ изменить дату, когда файл был изменен / создан (который отображается в Nautilus или с помощью команды ls -l)? В идеале я ищу команду, которая может изменить метки даты / времени целой пачки файлов на определенное количество времени раньше или позже (например, +8 часов или -4 дня и т. Д.).
7 ответов
Пока вы являетесь владельцем файла (или 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 не отслеживают это значение. E сть ctime
связан с файлами, но он отслеживает, когда метаданные файла были в последний раз изменены. Если права доступа к файлу никогда не меняются, может случиться так, что он задержит время создания, но это совпадение. Явное изменение времени изменения файла считается изменением метаданных, поэтому также будет иметь побочный эффект обновления ctime
,
Самый простой способ - доступ и изменение будут одинаковыми:
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
Смотрите: сенсорный человек
Спасибо за помощь. Это сработало для меня:
В терминале перейдите в каталог для редактирования даты. Затем введите:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
Вы увидите ">" после того, как нажмете ввод, за исключением последнего раза -> "готово".
Примечание. Вы можете изменить "201203101513".
"201203101513" = это дата, которую вы хотите для всех файлов в этом каталоге.
Сенсорный может ссылаться на дату файла сам по себе, не нужно звонить 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' '{}'
Этот маленький сценарий по крайней мере работает для меня
#!/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
Прошло много времени с тех пор, как я написал какую-либо программу для 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
изменит дату на минус один год в каталоге, где вы находитесь.
Просто измените дату и время в настройках. затем сохраните ваш файл, он автоматически изменится