Есть ли способ изменить дату, когда файл был изменен / создан (который отображается в 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" {} +
Эта форма невозможна с относительным временем файла версия, потому что она использует оболочку для формирования аргументов touch
.
Что касается времени создания, большинство файловых систем Linux не отслеживают это значение. С файлами связан 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
См .: Touch Man
Спасибо за помощь. Это сработало для меня:
В терминале перейдите в каталог для редактирования даты. Затем введите:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
После нажатия клавиши Enter вы увидите «>», за исключением последнего раза -> «Готово».
Примечание: вы можете изменить «201203101513»
«201203101513» = - это дата, которую вы хотите для всех файлов в этом каталоге.
просто измените дату и время в настройках. затем сохраните ваш файл, он автоматически изменится
Этот маленький сценарий, по крайней мере, работает для меня
#!/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
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' '{}'
Прошло много времени с тех пор, как я написал какую-либо программу для Unix, но я случайно неправильно установил год на куче рождественских фотографий, и я знал, что если я не изменю дату с 2015 на 2014, это будет проблема позже.
Может быть, это простая задача, но я не нашел простого способа сделать это.
Я изменил сценарий, который нашел здесь, который первоначально использовался для изменения даты на минус один месяц.
Вот оригинальный сценарий:
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS= Вот мой измененный сценарий, который принудительно назначил дату «2014»:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS= Теперь я понимаю, что мог бы сделать больше универсальная версия:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS= Чтобы использовать этот файл, вам нужно написать его и
chmod +x fn
выполнить:
./fn files-to-change
fn = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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 = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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= Чтобы использовать этот файл, вам нужно написать его и
chmod +x fn
выполнить:
./fn files-to-change
fn = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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 = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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= Теперь я понимаю, что мог бы сделать больше универсальная версия:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS= Чтобы использовать этот файл, вам нужно написать его и
chmod +x fn
выполнить:
./fn files-to-change
fn = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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 = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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= Чтобы использовать этот файл, вам нужно написать его и
chmod +x fn
выполнить:
./fn files-to-change
fn = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
\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 = your-file- name-that-is-your-command
Пример
./fn *.JPG
изменит дату на минус один год в каталоге, где вы находитесь.
Если вы просто хотите изменить дату файла на "прямо сейчас", вы можете:
echo "" >> man.jpg
Это должно работать для любых расширений.
Кроме того, в то время как touch -d "2 часа назад"
или touch -a -m -t 201512180130.09
не влияет на файлы файловой системы Windows, этот метод действует. (например, когда вы используете WSL Linux Bash)