- Команда touch в Linux
- Метки времени файлов Linux
- Как использовать сенсорную команду
- Изменение только времени доступа или модификации
- Меняем только время доступа
- Измените только время изменения
- Установка конкретных отметок времени
- Использование метки времени другого файла
- Изменение метки времени символической ссылки
- Выводы
- How can I change ‘change’ date of file?
- Изменение метки времени файла в Linux — команда touch
Команда touch в Linux
Команда touch позволяет обновлять временные метки в существующих файлах и каталогах, а также создавать новые пустые файлы.
В этом руководстве мы покажем вам, как использовать сенсорную команду, на практических примерах и подробных объяснениях наиболее распространенных параметров команд.
Метки времени файлов Linux
Прежде чем перейти к использованию сенсорной команды, давайте начнем с обзора временных меток файлов в Linux.
Файл в Linux имеет три отметки времени:
- atime (время доступа) — время последнего доступа / открытия файла какой-либо командой или приложением, например cat , vim или grep .
- mtime (время изменения) — время последнего изменения содержимого файла.
- ctime (время изменения) — время последнего изменения атрибута или содержимого файла. Атрибут включает права доступа к файлу, право собственности на файл или местонахождение файла.
Чтобы отобразить статус файла, включая временные метки, используйте команду stat .
Для создания нового файла требуются права на запись в родительский каталог. В противном случае вы получите сообщение об ошибке в разрешении отказано.
Как использовать сенсорную команду
В простейшей форме при использовании без каких-либо опций, если имя файла, указанное в качестве аргумента, не существует, touch создаст новый файл.
Если файл уже существует, коснитесь, чтобы изменить время последнего доступа и модификации файла на текущее время.
Например, если файл file1 не существует, следующая команда создаст его, иначе она изменит его временные метки:
Чтобы создать или изменить несколько файлов одновременно, укажите имена файлов в качестве аргументов:
Если вы не хотите, чтобы команда touch создавала новые файлы, используйте параметр -c ( —no-create ).
Например, если существует файл file1 следующая команда изменит временные метки файла, в противном случае она ничего не сделает:
Изменение только времени доступа или модификации
По умолчанию, если параметр не используется, прикосновение обновит время последнего доступа к файлу и времени изменения до текущего времени. Используя параметры -a и -m , вы можете изменить только одну из этих временных меток.
Меняем только время доступа
Используйте параметр -a чтобы изменить только время доступа к файлу:
Измените только время изменения
Используйте параметр -m чтобы изменить время изменения файла:
При изменении времени изменения время изменения также будет обновлено.
Установка конкретных отметок времени
Сенсорная команда также позволяет нам обновлять или создавать файл с определенным временем, отличным от текущего времени.
Используйте параметр -d ( —date= ), чтобы указать строку даты и использовать ее вместо текущего времени.
Например, чтобы изменить время последнего доступа и модификации file1 на 1 июня 2018 11:02, вы должны использовать следующую команду:
touch -d '1 June 2018 11:02' file1
Строку даты необходимо заключить в одинарные кавычки.
Вы также можете указать частичную строку даты и времени для сенсорной команды. Предоставляя только дату, автоматически меняет год на текущий:
Используйте параметр -t чтобы указать отметку времени и использовать ее вместо текущего времени. Аргумент отметки времени должен быть в следующем формате:
Например, следующая команда установит время последнего доступа и модификации file1 на 1 июня 11:02 текущего года.
Использование метки времени другого файла
Параметр -r ( —reference= ) позволяет нам указать справочный файл и использовать его временные метки вместо текущего времени.
Например, следующая команда скажет touch использовать время file1 для file2 :
Изменение метки времени символической ссылки
По умолчанию, если вы используете сенсорную команду для символической ссылки, она изменяет временные метки файла, на который она указывает.
Используйте -h ( —no-dereference ), чтобы изменить метку времени символической ссылки.
Например, чтобы изменить временные метки символической ссылки symlink1 вы должны использовать:
Выводы
К настоящему времени вы должны хорошо понимать, как использовать сенсорную команду Linux.
How can I change ‘change’ date of file?
You cannot change the ctime by ordinary means. This is by design: the ctime is always updated to the current when you change any of the file’s metadata, and there is no way to impose a different ctime. To change the ctime of a file, you need to do one of the following:
- Set the system time to the ctime you want to impose, then touch the file, then reset the system time.
- Modify the kernel to add an interface to change the ctime.
- Access the disk image directly (e.g. with debugfs ) and twiddle the bits on the disk (don’t do it while the filesystem is mounted).
You have the answer on related SO question pointed by jw013, for extX, on unmounted disk :
# Update ctime debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1 # Drop vm cache so ctime update is reflected echo 2 > /proc/sys/vm/drop_caches
$ NOW=$(date) && date -s «2030-08-15 21:30:11» && touch file.txt && date -s «$NOW»
The ctime of a file is updated when any of the metadata is changed.
$ ls -l x.py -rw-rw-r--. 1 ignacio ignacio 485 Mar 26 2010 x.py $ stat -c %z x.py 2010-03-26 11:57:56.237068175 -0400 $ chown ignacio x.py $ stat -c %z x.py 2012-04-08 15:31:33.682383575 -0400 $ ls -l x.py -rw-rw-r--. 1 ignacio ignacio 485 Mar 26 2010 x.py
evandrix’s answer excerpted in the next line,
NOW=$(date) && date -s «2030-08-15 21:30:11» && touch file.txt && date -s «$NOW»
needs to be improved as described below :
In some systems like mine, date output doesn’t give a valid format to set with date -s
My system bash shell version : GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
My system date command version : date (GNU coreutils) 8.30
My system date command output and setting the date with this format is:
# date Tue 21 Jan 2020 01:36:22 PM +03 # date -s "Tue 21 Jan 2020 01:36:22 PM +03" date: invalid date ‘Tue 21 Jan 2020 01:36:22 PM +03’
So it is necessary to improve evandrix answer;
It would be better to assign the NOW variable to the timestamp value
change NOW=$(date) to NOW=$(date +@%s)
NOW=$(date +@%s) && date -s "2030-08-15 21:30:11" && \ touch file.txt && date -s "$NOW"
Adding sudo command for non root user
sudo bash -c 'NOW=$(date +@%s); date -s "2030-08-15 21:30:11"; touch file.txt; date -s "$NOW"'
sudo bash -c 'NOW=$(date +@%s); date -s "$2"; touch "$1"; date -s "$NOW"' -- \ "file.txt" "2030-08-15 21:30:11"
In this way for easy use, the filename and setting date are assigned as arguments at the end of the line.
Изменение метки времени файла в Linux — команда touch
Каждый файл в Linux ассоциирован с временной меткой, которая показывает время последнего доступа, последней модификации и последнего изменения.
Когда мы создаем новый файл или изменяем существующий или его атрибуты, эта временная метка автоматичекси изменяется
Touch — это команда которая используется для изменения временных меток (время доступа, время модификации и время изменения файла)
Данную команду Вы вряд ли будете использовать часто, но в некоторых случаях она может оказаться очень полезной
Вы можете создать пустой файл используя команду touch. Представленный ниже пример создаст файл нулевой длины с именем grnd.txt
Вы также можете использовать опцию -с, чтобы избежать создания новых файлов. То бишь если мы используем ключ -c и файл с таким именем не существует, то команда touch не создаст этот файл.
Вы также можете создать более одного файла используя только одну команду touch. Пример показывает создание 4 файлов с именами ab de fj kl
Мы можем изменить метку о времени доступа к файлу используя ключ -a. По умолчанию установиться текущее системное время.
$ stat grnd.txt File: `grnd.txt' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 801h/2049d Inode: 3408768 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1001/ alexey) Gid: ( 4/ adm) Access: 2012-11-20 14:07:44.948481916 +0400 Modify: 2012-11-20 14:07:44.948481916 +0400 Change: 2012-11-20 14:07:44.948481916 +0400 Birth: -
После выполнения команды опять проверим состояние файла:
$ stat grnd.txt File: `grnd.txt' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 801h/2049d Inode: 3408768 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1001/ alexey) Gid: ( 4/ adm) Access: 2012-11-20 14:27:29.264508552 +0400 Modify: 2012-11-20 14:07:44.948481916 +0400 Change: 2012-11-20 14:27:29.264508552 +0400 Birth: -
3. Изменить метку временя модификации (Modify)
Данную команду можно использовать для изменения времени модификации всех объектных файлов, например для использования утилиты make.
Помимо того, что Вы можете изменить метки на текущее время, Вы также можете задать явные значение этих времен, то бишь то время, которое Вам необходимо. Для этого используются ключи -t и -d
YY – Показывает последние две цифры года. Если значение YY находится между 70 и 99, то значение СС принимается как 19. А если значение YY jn 00 до 37, то СС будет установлено как 20. Невозможно задать дату более 18 Января 2038 года.
$ touch -a -m -t 203710141103.24 grnd.txt
Проверим результат выполнения:
:~$ stat grnd.txt File: `grnd.txt' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 801h/2049d Inode: 3408768 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1001/ alexey) Gid: ( 4/ adm) Access: 2037-10-14 11:03:24.000000000 +0400 Modify: 2037-10-14 11:03:24.000000000 +0400 Change: 2012-11-20 15:08:04.992597671 +0400 Birth: -
Рассмотрим другой пример с более удобочитаемой записью даты:
$ touch -d "2012-10-20 13:13:13.000000000 +0400" grnd.txt
Команда touch будет очень полезна для разработчиков, особенно если работать с Makefiles
Вы также можете взять один файл как эталон и обновить метки времени другим файлам, то бишь другие файлы будут иметь метки времени такие же как и у эталонного. Для этого используется ключ -r