Які законні способи використання команди `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
Ще одне поширене використання: торкніться файлу до певної дати, а потім "знайти / -нові / той / файл", щоб знайти всі файли, змінені / створені після нього
Олів'є Дулак,

@casey Коли я перевірив документацію, echo -nя бачу, що в ній написано "не виводити новий рядок". Тож я не бачу, як це може створити порожній файл. Ви можете уточнити, будь ласка?
Geek

3
@Geek echo -nвиведе порожню рядок, а сам по собі нічого не робить. Перенаправлення його виводу через >>приводить порожній вихід до файлу. Перенаправлення призведе до створення файлу, якщо файл не існує.
casey

6
Це не працює: відкриття існуючого файлу для виводу, але не запис до нього, не змінює mtime (у моїй системі, все одно). Навіть якщо це було, вам не потрібно і не слід використовувати echo -nдля команди, яка нічого не робить. echo -nможе вивести рядок "-n" під деякими оболонками. Якщо вам дійсно потрібна команда, яка нічого не робить, :або trueє кращим варіантом, але >> myfileсама по собі є також ідеально правильним способом створення файлу, якщо його не існує. Все це, звичайно, підтримує вашу відповідь, що вам слід просто скористатися «дотиком».
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? Чи є утиліта, яка мені це скаже? Іншими словами, як я можу визначити вхід на дотик?
Geek

4
@Geek Переглянувши номер та зазначивши, що перша частина, 20131101може бути розбита на 2013-11-011 листопада 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 на додаткові відомості під назвою: Що ви можете зробити з файлом, не запускаючи часову позначку "Змінити"? .


@sim: моє запитання означає, що я знаю, що це сенс для зміни часових позначок. Я просто хотів знати, чому чесний користувач цього хоче. Якби не частина часу вашої відповіді, я би дав вам -1.
Quora Feans

16
@QuoraFea - моя відповідь - на вашу користь і будь-коли користувач, який коли-небудь стикається з нею в майбутньому. Будь ласка, не вважайте, що відповідь є виключно заради вас, і мені шкода, якщо я образив вас якимось чином, це було не моїм наміром, я просто намагався пояснити основи того, як працює час.
slm

@sim: Я не ображаюся, просто подумав, що відповідь йде не в правильному напрямку. У будь-якому випадку, дякую за цю відповідь.
Quora Feans

@QuoraFea - ви дуже вітаємо, і дякую за ваш Q. Вони оцінені!
slm

1
@Geek - спробуйте команди. Це правильний вихід з ls -lкаталогу, де файли мають розмір 0, а ще нічого не існує. Як тільки ви надасте одному з розмірів файлів, то загальний показник відобразиться з / кількість блоків, якими користуються файли. Дивіться мої оновлення, якщо ви не впевнені, я додав приклад.
slm

20

Окрім двох інших дуже хороших відповідей, які ви отримали, ще одна користь, з ваших слів, для

створити помилкове враження про вік файлу

наприклад, для використання в резервних схемах . Можливо, ви не хочете оновлювати резервну копію новою, оскільки вони однакові, або оскільки зміни не мають значення в порівнянні з витратами на оновлення резервної копії, скажімо, повільної лінії на віддалений хост. Щоб досягти цього, у вас є простий варіант позначити файл резервного копіювання новою часовою позначкою, не підробляючи, але оголосивши, що часова мітка цього файлу тепер є іншою.

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


20

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

Звичайні інструменти збирання - makeі його похідні - намагаються зберегти роботу, не перекомпонувавши / перебудовуючи файли, якщо один з файлів, який увійшов до їх створення, не змінився - наприклад, якщо .o файл останніх, ніж .c джерело, зазвичай можна безпечно припустити, що джерело 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

Одне використання - це виправлення часової позначки файлу, який був неправильно встановлений.

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

Зазвичай це не те, що бажано. Дотик може "виправити" це.

Іншим способом є відображення модифікації файлу, яку було скасовано, відновивши часову позначку файлу до того, що було до операцій "редагування ... скасування редагування".


2
Справді. За час, який я знайшов alias cp='cp --preserve=timestamps', більше підходить для мене на ПК…
Руніум,

5

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

Дотик, ймовірно, може змінити часову позначку, навіть якщо файл зараз перебуває під обов'язковим або дорадчим блокуванням або ексклюзивним відкритим. Хммм, ніколи цього не тестували і не читали про це ...


2
>>додасть замість перезапису
Michael Mrozek

Я думав про це згадати, але це стає ще більше на територію побічних ефектів. Вам також слід зазначити той факт, що це призведе до помилки, якщо файл вже відкрито ексклюзивно, і т. Д. І т. Д. І т. Д. Проблема, яка може виникнути через використання також. Я здогадуюсь, що мій вторинний момент - окрім первинного, що трохи швидше просто торкнутися статистики файлу - полягає в тому, що це гарна ідея написати код, який говорить це прямо, а не битися навколо куща.

4

Ось один - я використовую програмну програму під назвою SageTV для запису телепередач - вони часто записуються в MPEG-2, що не дуже ефективний кодек, а також не є iPad / iPhone. Тому я конвертую файли в .mp4 файли. Але при відтворенні файлів SageTV очікує, що часова мітка файлу буде колись розпочато телевізійне шоу - якщо ні, то він накручує часові шкали шоу, щоб не легко перейти на FF чи REW. Тому я використовую сенсор, щоб скинути часову позначку файлу .mp4 таким чином, як оригінальний файл.
Це законно?


2

Часто у вас може бути процес, який змінюється від userid, наприклад, від root -> чогось іншого. Дотик може дати вам можливість створити файл у місці, до якого може торкатися лише root, перш ніж програма почне входити до нього як інший користувач.


Це не використання дотику, якого не можна досягти "відлунням" - див. Оригінальне запитання автора
Домінго Ігнасіо Гальдос

Відлуння передбачає відкриття потоку тощо. Дотик можна оптимізувати, працюючи безпосередньо з вводами. ВИКОНАННЯ FTW!
користувач56560

2

На роботі у нас є архів цифрових карт, що починаються 15+ років. Ці старі карти зберігаються у різних форматах, таких як PostScript, EMF, PRN, hpgl2, pdf тощо, які більшість програм не розуміють. Або вам потрібно десяток різних програм, щоб побачити їх усіх.

Щоб полегшити пошук і перегляд усіх цих різних форматів, ми створюємо версії jpeg карт, а потім натискаємо, щоб файл 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.