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

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

242
задан 7 December 2012 в 11:02

8 ответов

Пока вы являетесь владельцем файла (или 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.

0
ответ дан 7 December 2012 в 11:02

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

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

0
ответ дан 7 December 2012 в 11:02

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

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

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

После нажатия клавиши Enter вы увидите «>», за исключением последнего раза -> «Готово».

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

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

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

0
ответ дан 7 December 2012 в 11:02

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

0
ответ дан 7 December 2012 в 11:02

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

#!/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
0
ответ дан 7 December 2012 в 11:02

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' '{}'
0
ответ дан 7 December 2012 в 11:02

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

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

0
ответ дан 7 December 2012 в 11:02

Если вы просто хотите изменить дату файла на "прямо сейчас", вы можете:

echo "" >> man.jpg

Это должно работать для любых расширений.

Кроме того, в то время как touch -d "2 часа назад" или touch -a -m -t 201512180130.09 не влияет на файлы файловой системы Windows, этот метод действует. (например, когда вы используете WSL Linux Bash)

0
ответ дан 8 February 2021 в 16:02

Другие вопросы по тегам:

Похожие вопросы: