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

83

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

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

Quora Feans
источник
15
вместо этого echo -n > filenameвы можете запустить следующее:>filename
AMADANON Inc.
77
Каковы незаконные использования?
bmargulies
10
Unless to create the false impression about the age of a file, Не обязательно ложное впечатление. Что делать, если вы хотите изменить время модификации? Это может быть полезно в сценариях. Этот скрипт сильно зависит от touchкоманды, и его очень удобно и просто.
VL-80
7
Подумайте, что tar(или другие деархиваторы) делают при извлечении архива. Обычно они устанавливают время модификации файла на время из архива, а не на время извлечения архива, и это является желательной функцией. Поскольку для программы пользовательского режима допустимо создавать ложные временные метки, не так много аргументов, почему touch(или какой-либо другой программе командной строки) не следует разрешать это на основе аргумента командной строки. Изучение C не делает вас более законным, чем кто-либо, пишущий shсценарий ;-)
Стив Джессоп
5
В Unix нет метки времени, которая описывает ageфайл. Это будет creationвременная метка, и нет такой временной метки для файлов в Unix.
Кевин Феган

Ответы:

98

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

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

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

Casey
источник
18
Другое распространенное использование: коснитесь файла к определенной дате, затем «найдите / -newer / the / file», чтобы найти все файлы, которые были изменены / созданы после него
Оливье Дюлак
@casey Когда я проверил документацию, echo -nя вижу, что там написано "не выводить завершающий перевод строки". Поэтому я не вижу, как это может создать пустой файл. Можете ли вы уточнить, пожалуйста?
Компьютерщик
3
@Geek echo -nвыведет пустую строку и само по себе ничего не делает. Перенаправление его вывода через >>вызывает добавление пустого вывода в файл. Перенаправление приведет к созданию файла, если файл не существует.
Кейси
6
Это не работает: открытие существующего файла для вывода, но не запись в него, не меняет mtime (в любом случае, в моей системе). Даже если это так, вам не нужно и не следует использовать echo -nкоманду, которая ничего не делает. echo -nможет выводить строку "-n" под некоторыми оболочками. Если вам действительно нужна команда, которая ничего не делает :или trueявляется лучшим вариантом, но >> myfileсама по себе также является совершенно правильным способом создания файла, если он не существует. Все это, конечно же, подтверждает ваш ответ, что вы должны просто использовать «touch».
HVD
40

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

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

touch -amt 201311010000 myref
find . -type f -newer myref -exec ls -ld {} +
JRFerguson
источник
Как рассчитать, что 201311010000 означает Nov1,2013? Есть ли утилита, которая скажет мне это? Другими словами, как я могу определить вход для прикосновения?
Компьютерщик
4
@Geek Посмотрев на число и отметив, что первая часть, 20131101может быть разбита на 2013-11-011 ноября 2013 года или на 1 ноября 2013 года. Затем можно предположить, что 0000часть указывает конкретное время дня, в данном случае 00 часов, 00 минут. Или вы можете просто посмотреть на справочную страницу touch, где точно указан формат (см. -t).
JAB
@Geek Руководства - ваш друг :-)
JRFerguson
39

В 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Выходные данные 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. информация о времени / дате файла - команда 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 для более подробной информации под названием: Что вы можете сделать с файлом, не вызывая метку времени «Изменить»? ,

SLM
источник
@ Сим: мой вопрос подразумевает, что я знаю, что касание для изменения временных меток. Я просто хотел знать, зачем честному пользователю этого хотеть. Если бы не часть вашего ответа, я бы дал вам -1.
Quora Feans
16
@QuoraFea - мой ответ для вашей выгоды и для любого пользователя, который когда-либо сталкивался с этим в будущем. Пожалуйста, не думайте, что ответ только ради вас, и я извиняюсь, если я вас чем-то обидел, это не было моей целью, я просто пытался объяснить, как работает время.
slm
@ Сим: Я не обижаюсь, просто думал, что ответ идет не в правильном направлении. В любом случае, спасибо за этот ответ.
Quora Feans
@QuoraFea - добро пожаловать, и спасибо за ваш вопрос. Они ценятся!
slm
1
@Geek - попробуйте команды. Это правильный вывод из ls -lдиректории, где файлы имеют размер 0, и больше ничего не существует. Как только вы укажете один из размеров файлов, будет отображаться общее количество с количеством блоков, используемых файлами. Смотрите мои обновления, если вы не уверены, я добавил пример.
slm
20

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

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

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

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

LSerni
источник
20

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

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

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

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

keshlam
источник
Хотя это хорошая идея изменить файл для восстановления, я бы поспорил с этим. Некоторые системы редактирования исходного кода могут запутаться в измененном файле. Так touchже плохо, как ручное изменение. Чтобы вызвать перестройку, я предлагаю удалить выходные файлы .oрассматриваемого источника.
Харпер
1
Ручное изменение и удаление файлов .o требует больше времени и набора текста, а ручное изменение намного более подвержено ошибкам. И мы говорим только об изменении метки времени в рабочей копии - если изменения будут сделаны позже, файл будет правильно отражать метку времени изменения. И не все системы контроля версий сбиты с толку отметкой времени.
Дэвид
1
Как сказал Дэвид. Это действительно было стандартной практикой Unix не так давно, и до сих пор остается стандартной практикой для разработчиков, работающих вне IDE.
Кешлам
12

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

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

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

millimoose
источник
4
Это на самом деле имеет место с mod_wsgi и apache; Вы можете перезагрузить, например, веб-приложение django, просто коснувшись файла wsgi.
Сапи
11

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

  • Обновите временную метку файлов изображений (GIF / JPG / и т. Д.) До времени, когда они были сняты. Не все средства визуализации читают или учитывают информацию EXIF.
  • Сохраняйте время c / m при массовом обновлении набора файлов, где отметка времени важна для пакета файлов.
  • Установите время пакетного (т.е. CSV) файла, если вам нужно выполнить другой импорт после сбоя, а программа импорта зависит от метки времени (оставьте это обсуждение в другой теме :-))
  • Архивные цели, то есть иметь резервные копии в папках на основе года, затем установить время для этих папок на 1 января ГГГГ для легкой сортировки
sastorsl
источник
7

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

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

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

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

Кевин Феган
источник
2
На самом деле. Время, которое я нашел alias cp='cp --preserve=timestamps', больше подходит для меня на ПК…
Runium
5

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

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


источник
2
>>добавлю вместо перезаписи
Михаил Мрозек
Я подумывал упомянуть об этом, но это все больше распространяется на территорию с побочными эффектами. Вы также должны упомянуть тот факт, что будет выдано сообщение об ошибке, если файл окажется уже открытым для эксклюзивного доступа и т. Д. И т. Д. И т. Д. Проблема, которая может также возникнуть при использовании>. Я полагаю, что моя вторичная точка зрения - помимо основной - просто быстрее прикоснуться к статистике файла - это хорошая идея написать код, который говорит об этом прямо, а не биться вокруг куста.
4

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

Wayner
источник
2

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

user56560
источник
Это не использование прикосновения, которое недостижимо для «эха» - см. Оригинальный вопрос автора
Доминго Игнасио Галдос
Эхо предполагает открытие потока и тому подобное. Touch может быть гипероптимизирован, работая напрямую с inode. ПРОИЗВОДИТЕЛЬНОСТЬ FTW!
user56560
2

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

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

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

Мэтт Уилки
источник
1

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

TecBrat
источник
1

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

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

Nils
источник
0

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

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

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

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

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

Geeb
источник