Каково законное использование команды `touch`?

В чем смысл команды touch ? Я знаю, что могу создавать с ним пустые файлы, но так же имеет место и echo -n .

Иначе зачем кому-то менять временные метки файла? Если не создать ложное впечатление о возрасте файла, я не вижу другого использования, и это не является законным (с моей точки зрения).

Одним из преимуществ touch является то, что он может указывать произвольные временные метки, тогда как echo -n всегда будет приводить к текущему времени.

Примером законного использования является обновление временной метки файла исходного кода, поэтому программа, например make , рассмотрит исходный файл, более новый, чем его скомпилированный объект, и восстановит его.

Другие виды использования – создавать файлы, которые функционируют исключительно на основе их существования, например /etc/nologin , что запрещает логины, если они существуют. Я также утверждаю, что touch myfile – это более простая конструкция, чем echo -n >> myfile , а также более короткий тип.

Основной системный вызов ( utime ) важен для различных утилит, таких как tar , для установки временных меток только что скопированного (не-tarred) файла. Некоторые утилиты резервного копирования также могут быть настроены для сброса последних копий файлов, которые они скопировали.

Одно законное использование touch – создать файл с определенной меткой времени. Такой «ссылочный» файл может затем использоваться командами типа find . Например, чтобы найти все файлы, которые были недавно изменены до 1 ноября 2013 г. (т.е. 2013/11/01)

 touch -amt 201311010000 myref find . -type f -newer myref -exec ls -ld {} + 

Основной целью touch команды является манипулирование метками времени и созданием файлов.

Примеры

1. создание файлов

 $ ls -l total 0 $ touch file{1..3} $ ls -l total 0 -rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file1 -rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file2 -rw-rw-r--. 1 saml saml 0 Jan 12 13:33 file3 

ПРИМЕЧАНИЕ . total 0 вывод total 0 из ls -l верен. Эта реализация ls показывает количество блоков, используемых файлами, когда они перечислены. Вы можете убедиться в этом, добавив ключ -s в ls . Это отобразит блоки, используемые каждым файлом. Здесь я добавил 2 символа в файл1 и файл2.

пример

 $ ls -ls total 8 4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:07 file1 4 -rw-rw-r--. 1 saml saml 3 Jan 13 12:09 file2 0 -rw-rw-r--. 1 saml saml 0 Jan 13 12:05 file3 

2. информация о времени / дате команды file-stat

 $ stat file1 File: 'file1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd02h/64770d Inode: 11403667 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml) Context: unconfined_u:object_r:user_home_t:s0 Access: 2014-01-12 13:33:38.279456149 -0500 Modify: 2014-01-12 13:33:38.279456149 -0500 Change: 2014-01-12 13:33:38.279456149 -0500 Birth: - 

Мы можем использовать touch чтобы манипулировать различными метками времени для данного файла.

3. выдержка из страницы касания

  -a change only the access time -m change only the modification time -t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time 

4. Управление временем доступа

 $ touch -a -t200001010000 file1 $ stat file1 File: 'file1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd02h/64770d Inode: 11403667 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml) Context: unconfined_u:object_r:user_home_t:s0 Access: 2000-01-01 00:00:00.000000000 -0500 Modify: 2014-01-12 13:33:38.279456149 -0500 Change: 2014-01-12 13:38:52.023434696 -0500 Birth: - 

5. манипулировать временем изменения

 $ touch -m -t200001010000 file1 $ stat file1 File: 'file1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd02h/64770d Inode: 11403667 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ saml) Gid: ( 1000/ saml) Context: unconfined_u:object_r:user_home_t:s0 Access: 2000-01-01 00:00:00.000000000 -0500 Modify: 2000-01-01 00:00:00.000000000 -0500 Change: 2014-01-12 13:39:31.060432026 -0500 Birth: - 

Возможно, вам будет интересно узнать время изменения (ctime). Это невозможно манипулировать с помощью touch . Это отслеживает время, когда какой-либо из метаданных был затронут файл. Дополнительную информацию см. В этом U & L Q & A, озаглавленном: Что вы можете сделать с файлом без запуска «Временной метки« Изменить »? ,

Одним из наиболее распространенных применений touch является – или, по крайней мере, используется – чтобы вызвать перестройку кода.

Обычные инструменты построения – make и его производные – пытаются сохранить работу, не перекомпилируя / перестраивая файлы, если один из файлов, которые вступили в их создание, не изменился – например, если файл .o более поздний, чем. c исходным кодом, обычно безопасно предполагать, что источник C не был изменен после компиляции для создания этого объектного файла.

Но есть моменты, когда вы хотите заставить что-то перестроить. Вы можете сделать ненужную модификацию одного из своих исходных файлов, но это может случайно нанести ущерб. Вместо этого вы можете просто touch файла, сделав его новым, без риска изменить его содержимое – и этого было бы достаточно, чтобы убедить, что пришло время перестроить все, что зависит от этого файла.

Есть и другие виды использования, но исторически это было большим.

Помимо двух других очень хороших ответов, которые вы получили, еще одно использование, по вашим словам,

создать ложное впечатление о возрасте файла

например, для использования в схемах резервного копирования . Возможно, вы захотите не обновлять резервную копию более новой версии, поскольку они идентичны, или поскольку изменения не имеют значения по сравнению с расходами на обновление резервной копии, скажем, на медленной линии для удаленного хоста. Чтобы достичь этого, у вас есть простая возможность маркировать файл резервной копии с более новой меткой времени, а не притворяться, но объявляя, что метка времени действия этого файла теперь другая.

Впечатление о возрасте файла теперь действительно ложно, но его значение является реальным и законным.

Я работал, по крайней мере, с одной веб-картой (не могу вспомнить), что в режиме разработки наблюдал файлы исходного кода для изменений и перезагружал приложение, когда это произошло.

Конечно, иногда вы хотели, чтобы он перезагружался после изменения чего-то, что он не наблюдал, и в этом случае touch к его основному файлу конфигурации делало трюк.

Итак, в общем случае, всякий раз, когда вы хотите запустить процесс, вызванный изменениями в файле, без фактического изменения файла.

Законное использование прикосновений:

  • Обновите временную метку файлов изображений (GIF / JPG / etc) до момента их удаления. Не все визуализаторы читают или принимают информацию EXIF.
  • Храните время c / m при массовом обновлении набора файлов, где временная метка важна для набора файлов.
  • Задайте время файла партии (например, CSV), если вам нужно сделать другой импорт после сбоя, а программа импорта зависит от отметки времени (оставьте это обсуждение в другой теме :-))
  • Архивные цели, т. Е. Иметь резервные копии в папках по годам, а затем установить время в этих папках до 1 января YYYY для легкой сортировки

Одно из них – исправить временную метку файла, который был неправильно установлен.

Например, большинство способов копирования файла (и для некоторых способов перемещения файла) приводит к тому, что новый файл имеет временную метку текущего времени, а не временную метку исходного файла.

Обычно это не то, что нужно. Touch может «исправить» это.

Другое использование заключается в том, чтобы отразить изменение файла, которое было отменено, восстановив временную метку файла до того, что было до операций «edit … undo-edit».

Важным отличием от таких things как echo (или даже лучше > file как упоминалось другими, является то, что прикосновение не приведет к разрыву содержимого. > file будет пустым файл. touch не будет. Вместо того, чтобы думать о трюках, чтобы избежать повреждения контента, просто используйте прикосновение! В любом случае он будет делать меньше работы в ядре, потому что он будет работать только с атрибутами файла, не теряя время, фактически готовясь к открытию, а затем выполняя закрытие.

Touch может, вероятно, изменить временную метку, даже если файл в настоящее время находится под обязательной или консультативной блокировкой или эксклюзивным открытым. Хммм, никогда не тестировал это или не читал об этом …

Вот один из них: я использую программную программу SageTV для записи ТВ-шоу – они часто записываются в MPEG-2, который не очень эффективный кодек, он также не поддерживает iPad / iPhone. Поэтому я конвертирую файлы в файлы .mp4. Но при воспроизведении файлов SageTV ожидает, что временная метка файла будет при запуске телевизионного шоу – если не он завинчивает временную шкалу шоу, так что это нелегко для FF или REW. Поэтому я использую touch, чтобы сбросить временную метку файла .mp4 так же, как и файл orignal.
Это законно?

Часто у вас может быть процесс, который изменяется от userid, например, от root -> что-то еще. Touch может дать вам возможность создать файл в месте, к которому может касаться только корень, прежде чем приложение начнет регистрироваться на нем в качестве другого пользователя.

На работе у нас есть архив цифровых карт, восходящий через 15 лет. Эти старые карты сохраняются в различных форматах, таких как PostScript, EMF, PRN, hpgl2, pdf и т. Д., Которые большинство программ не понимают. Или вам нужно десяток различных программ, чтобы увидеть их всех.

Чтобы облегчить поиск и просмотр всех этих различных форматов, мы создаем jpeg-версии карт, а затем используем touch, чтобы файл jpeg соответствовал исходной временной отметке исходного файла – часто спустя годы после создания оригинала.

Теперь мы можем использовать одну программу, такую ​​как Picasa, чтобы увидеть всю библиотеку и тривиально найти определенные диапазоны дат. Без прикосновения нам пришлось бы добавлять метаданные даты для каждого отдельного изображения, возможно, вручную, а затем искать по этим строкам при поиске определенного диапазона дат.

Я еще не использовал его для этой цели, но у меня есть сценарий, который читает файлы и их даты из каталога и читает их для использования на веб-странице. Если я должен отредактировать один, он изменит дату. Я решил touch к ним, чтобы сбросить порядок.

Некоторые init-скрипты сравнивают временную метку конфигурационного файла со своим собственным pid-файлом. Результат решает, чтобы перезагрузить запущенную службу или нет.

Если есть ситуация, когда вы не хотите изменять конфигурацию, но хотите принудительно перезагрузить, нажмите здесь, чтобы помочь вам.

У меня есть задание cron, которое получает изменения из базы данных, которая произошла между последним запуском задания и текущим запуском. Он создает XML-файл изменений, которые затем обрабатываются в другой базе данных. Он получает последнее время от отметки времени в выходном файле XML. *

Если что-то пойдет наперекосяк в обработке XML-файла, я, возможно, захочу повторить прогон с исходной даты не с даты, указанной на отметке времени нового файла XML.

Самый простой способ сделать это, а не редактировать сценарии, которые вызывают и т. Д., – это прикоснуться к файлу XML и заставить штамп времени быть необходимой мне датой.

Также, если я начинаю заново (без предыдущего выходного файла XML), я могу просто имитировать его существование, используя touch.

[*] Прежде чем кто-то отметит это, я понимаю, что время начинается, и запись XML-файла оставляет промежуток времени в несколько минут, когда могут произойти изменения БД. Работа выполняется в то время, когда изменения БД крайне маловероятны. Это мое оправдание, и я придерживаюсь этого 🙂