Есть ли способ изменить дату, когда файл был изменен/создан (которая отображается в Nautilus или с помощью команды ls -l)? В идеале я ищу команду, которая может изменить дату/временные метки целого набора файлов на определенное количество времени раньше или позже (например, +8 часов или -4 дня и т.д.).
Если вы являетесь владельцем файла (или 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" {} +
Такая форма невозможна в версии file time relative, потому что она использует оболочку для формирования аргументов к touch
.
Что касается времени создания, большинство файловых систем Linux не отслеживают это значение. Существует ctime
, связанный с файлами, но он отслеживает, когда метаданные файла были изменены в последний раз. Если у файла никогда не менялись права доступа, то может случиться так, что время создания будет совпадать, но это случайность. Явное изменение времени модификации файла считается изменением метаданных, поэтому побочным эффектом будет обновление ctime
.
Спасибо за помощь. Это сработало для меня:
В терминале перейдите в каталог для date-edit. Затем введите:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
Вы увидите ">" после нажатия клавиши Enter, за исключением последнего раза -> "done".
Примечание: Возможно, вы захотите изменить "201203101513"
"201203101513" = это дата, которую вы хотите получить для всех файлов в этом каталоге.
Самый простой способ - использовать и изменять будет то же самое:
touch -a -m -t 201512180130.09 fileName.ext
Где:
-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format
Если вы хотите использовать теперь
просто -T
и метка времени.
Чтобы убедиться, что они все одинаковые:
стат именем.доб
Прикосновение может ссылаться на файл's дата всех по себе, не нужно звонить дата
или использовать подстановку команд. Здесь'ы немного от Touch'S Инфо страницы:
`-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 часов в файл's дата (имя файла "файл" процитировала на всякий случай пространств и т. д.):
touch -r "file" -d '+8 hour' "file"
Используя цикл по всем файлам в текущей директории:
for i in *; do touch -r "$i" -d '+8 hour' "$i"; done
Я'вэ слышал, что с помощью *
и дать На
выбрать имена сам безопаснее, но с помощью `найти -print0 команды | команды xargs -0 прикосновение ... должна справиться большинство сумасшедшие символы, такие как символы новой строки, пробелы, кавычки, обратные слеши в имени. (ПС. старайтесь не использовать сумасшедшие символы в именах файлов, в первую очередь).
Например, чтобы найти все файлы в 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 и программы, но я случайно поставил год неправильно на кучу фотографий Рождество, и я знал, что если я не't изменить дату с 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
Здесь's мой модифицированный скрипт, который вынужден дату на год на "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
FН=ваш-файла-имя-что-это-ваша команда
Пример
./fn *.JPG
будет изменить дату на минус один год в директории, где вы находитесь.
просто измените дату и время в настройках. затем сохраните файл, он автоматически изменится.