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


83

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

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


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, а также она короче типа.


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 {} +

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


@ Сим: мой вопрос подразумевает, что я знаю, что касание для изменения временных меток. Я просто хотел знать, зачем честному пользователю этого хотеть. Если бы не часть вашего ответа, я бы дал вам -1.
— Quora Feans

16
@QuoraFea - мой ответ для вашей выгоды и для любого пользователя, который когда-либо сталкивался с этим в будущем. Пожалуйста, не думайте, что ответ только ради вас, и я извиняюсь, если я вас чем-то обидел, это не было моей целью, я просто пытался объяснить, как работает время.
— slm

@ Сим: Я не обижаюсь, просто думал, что ответ идет не в правильном направлении. В любом случае, спасибо за этот ответ.
— Quora Feans

@QuoraFea - добро пожаловать, и спасибо за ваш вопрос. Они ценятся!
— slm

1
@Geek - попробуйте команды. Это правильный вывод из ls -lдиректории, где файлы имеют размер 0, и больше ничего не существует. Как только вы укажете один из размеров файлов, будет отображаться общее количество с количеством блоков, используемых файлами. Смотрите мои обновления, если вы не уверены, я добавил пример.
— slm

20

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

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

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

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


20

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

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

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

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


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

1
Ручное изменение и удаление файлов .o требует больше времени и набора текста, а ручное изменение намного более подвержено ошибкам. И мы говорим только об изменении метки времени в рабочей копии - если изменения будут сделаны позже, файл будет правильно отражать метку времени изменения. И не все системы контроля версий сбиты с толку отметкой времени.
— Дэвид

1
Как сказал Дэвид. Это действительно было стандартной практикой Unix не так давно, и до сих пор остается стандартной практикой для разработчиков, работающих вне IDE.
— Кешлам

12

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

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

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


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

11

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

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

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, чтобы он совпадал с оригинальным файлом.
Это законно?


2

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


Это не использование прикосновения, которое недостижимо для «эха» - см. Оригинальный вопрос автора
— Доминго Игнасио Галдос

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

2

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

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

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


1

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


1

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

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


0

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.