Windows еквівалент команди "touch" Linux?


170

Що ви використовуєте, коли хочете оновити поле, змінене датою файлу в Windows?

  1. команди, доступні через C ++, .NET, C # або щось рідне для Windows (бажано Vista)
  2. інструменти / програми бажано безкоштовні, а також, якщо можливо, і з відкритим кодом

Edit: вже є сторінка для додатків , як вказував CheapScotsman тут .

Якщо хтось знає, як я можу це зробити через C ++, C #, WSH або щось подібне, добре і добре, інакше я б подумав, що все інше висвітлено в пов'язаному питанні.


Згадані чотири альтернативи, а також ще чотири не згадані тут, можна знайти у відповіді на подібне запитання: "Рекурсивна сенсорна команда Windows"
— JdeBP

stackoverflow.com/questions/210201/… згадує навантаження, у тому числіREM.>a
— барлоп

Відповіді:


356

Якщо ви хочете торкнутися штампа дати у файлі за допомогою Windows, скористайтеся такою командою у командному рядку:

copy /b filename.ext +,,

(де filename.extназва вашого файлу) Це +,,спеціальний прапор, який дозволяє copyйому просто оновити дату / час у файлі :

* Зміна часу та дати файлу

Якщо ви хочете призначити поточний час і дату файлу без зміни файлу, використовуйте наступний синтаксис:

copy /b Source+,,

Коми вказують на пропуск параметра Параметр призначення.

Редагувати на основі коментарів Люмі та Джастіна: помістіть це у пакетний файл, наприклад. touch.cmd

@COPY /B %1+,, %1

Це працює, навіть якщо файл відсутній у поточному каталозі (тестується на Windows 7).


45
Що це робить? Де це документально зафіксовано? (Google не вдається індексувати "+ ,,", а сайт MS не веде мене в правильному напрямку, оскільки пошук "копію" виявляє багато нічого корисного.) Я маю на увазі, він працює чудово, і я прийму це багато що належить, але мені цікаво.
— dash-tom-bang


14
type touch.batє @echo offі наступний рядок copy /b %1 +,,- C:\binвведіть його або що у вас є для власних сценаріїв, і тоді ви можете ним користуватися, як touch myfile.txt.
— Лумі

17
У Win7 це не працюватиме, якщо ви не знаходитесь у папці, що містить файл. Це створить копію в поточному робочому каталозі.

6
Якщо вам потрібно зробити це у віддаленій папці (шлях UNC) - ви також повинні вказати призначення команди для копіювання - copy /b Source+,, Source- де Sourceвключений повний шлях до файлу
— Джастін

160

Я використовував і рекомендую unxutils, які є рідними портами Win32 безлічі загальних утиліт Unix. Там є touchкоманда.


4
Як і майже будь-який порт Unix для Windows, це не вдається працювати з символами unicode у назвах файлів поза кодуванням, встановленим за замовчуванням для програм unicode. Тестове ім'я файлу, яке підключатиметься до кожного такого інструменту:"test тест τεστ.txt"
— RomanSt

gnuwin32 має його. але дійсно, gnuwin32's також не вдається для символів unicode.
— барлоп

1
Оновлення з 2017 року У Windows 10 ми можемо використовувати підсистему Linux для Windows, яка встановлює bash. Не потрібно Cygwin, MinGW, unxutils або будь-якого іншого часткового Unix для портів Windows. docs.microsoft.com/en-us/windows/wsl/install-win10
— Давос

95

Якщо все, що вам потрібно, це змінити останню модифіковану дату файлу (в моєму випадку):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

9
PowerShell FTW. Я маю на увазі, серйозно, Unix крутий, але PS крутіше.
— мат

1
Ви також можете оновити запис останніх разів для кількох файлів / папок

12
Це працюватиме лише на одному файлі. Для декількох файлів: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
— Елі Альгранті

2
Якщо ви хочете зробити це рекурсивно, це працює досить добре: gci -recu -inc " . " | % {$ _. LastWriteTime = Get-Date}
— BrainSlugs83

6
@ BrainSlugs83: використовуйте backticks `для коду:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
— alldayremix

58
type nul >>file & copy file +,,
  • Створюється, fileякщо його не існує.
  • Залишає вміст файлу в спокої.
  • Просто використовує cmdвбудовані модулі.
  • І останній доступ і створення раз оновлюється.

ОНОВЛЕННЯ

Гах! Це не працює для файлів, які лише для читання, тоді як touch. Я пропоную:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"

Шкода, що копія не може ігнорувати атрибут + r так, як це робить xcopy. Або шкода, що xcopy не підтримує дивного filename +,,синтаксису.
— Авель

На жаль, це не працює (принаймні, не в Windows 7). Здається, що інтерпретатор команд не оновлює часову позначку місця перенаправлення, якщо файл насправді не змінений (тобто немає даних для переадресації).
— Synetech

32

@ dash-tom-bang:

Ось пояснення таємничих "+" та коми Technet:

копія / b Джерело + ,,

Коми вказують на пропуск параметра Параметр призначення.

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

І це посилання на команду для копіювання Technet: http://technet.microsoft.com/en-us/library/bb490886.aspx


16
Тепер це просто заплутаний синтаксис. Серйозно, що вони думали? Також зауважте, що в цій же документації написано "Місце призначення: Обов'язково" ... Я вражений.
— sth

1
Здається, це навіть не працює у Vista ... Цікаво, чи придумали вони?
— quillbreaker

1
Працює в Windows 7
— Імран

5
Для мене це працювало навіть без коми: copy file.ext + Отже, документація далека від фактичної поведінки, оскільки поведінка від будь-яких розумних очікувань.
— Абган

2
Він працював у Windows Server 2008, але лише якщо ви знаходитесь у папці, що містить файл
— FrinkTheBrave


21

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

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}

2
Менш багатослівний, але при цьому використовуються лише стандартні скорочення Powershell:ls * -recurse | % { $_.LastWriteTime = Get-Date }
— Jonas

15

Проект GnuWin32 має порти Windows версій Gnu утиліти командного рядка Unix.

Він поставляється у вигляді декількох окремих пакетів, і ви можете встановити лише потрібні вам команди без інших залежностей. Для цього touchвам знадобиться пакет CoreUtils .


15

Я спробував це створити порожній файл у своєму пакетному сценарії. Ви можете скористатися цим:

ECHO text>file1.txt

3
Це НАЙДОЛО найкращий швидкий метод .. Мені просто потрібно було створити файл .gitignore, і Windows 7 продовжує скаржитися "треба вводити ім'я файлу" тощо. І т. Д. echo pie>.gitignoreПрацював ласощі - дякую!

4
@Alex Це не пов'язано, але помилка Windows полягає в тому, що файл починається з періоду. Існує дивний злом, щоб обійти це в Провіднику Windows: закінчіть файл також періодом. Тому введіть .gitignore.і, коли ви натискаєте клавішу Enter, Windows видаляє останній період. Божевільний, але це працює.
— Бред Купіт

1
Я хотів би, щоб я міг дати це достатньо грошей, щоб це завоювало великих гравців за популярністю.
— Джонатан Мі

1
Це не створює порожній файл, але файл file1.txt має "текст" у ньому.
— Джошуа Майєрс

14

cygwinпоставляється з touch. Я знаю, що ви згадали, що не хочете встановлювати цілий фреймворк, але cygwin досить легкий, і його можна викликати з вікна командування dos без увімкненого цілого командного рядка unix.

Ви також можете контролювати, які інструменти встановити, щоб ви могли просто встановити touch.exeфайл і залишити решту рамки.


2
До вашої точки зору, все, що вам потрібно встановити, це файл touch.exe і cygwin.dll в каталозі, щоб використовувати цей інструмент. Немає інших залежностей щодо використання інструментів на основі cygwin.
— Високий Джефф

1
коли я спробую це (win7x64) мені потрібні ще 4 cygwin dll, крім touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
— matt wilkie

14

Ось простий регфіл, який я написав, щоб додати правою кнопкою миші «торкнутись» у Windows Explorer . Сценарій його також буде легко, оскільки він просто закликає:

cmd.exe /c copy %1+nul %1 /by

І не забудьте copy nul some_fileстворити порожній файл (саме це я бачу touchнайчастіше).
— Джої

Ак! Zip-файл недоступний (щось про brinkster22.com, який повинен бути референтним сайтом). Джон, ти можеш це оновити?
— Dan7119

Працює над Win7. Не працює на WinXP: час виконання файлу залишається колишнім після виконання "копії".
— Egor Skriptunoff


11

Спробуйте це з CodeProject .

  • Не потрібно встановлювати.
  • Якщо хочете, ви навіть можете змінити джерело.

2
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
— Ян Скляренко

9

Ви також можете встановити Cygwin, який дає вам Touch, а також безліч інших * NIX команд.


2
не може жити на Windows без cygwin.
— jweede

А цигуїн без м’яти досить кульгавий.
— Ахе



4

Як щодо codeproject "Touch для Windows": http://www.codeproject.com/KB/applications/touch_win.aspx

редагувати; Те саме питання, що і тут: https://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command/51439


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

4

з веб-сайту:

Funduc Software Touch - це безкоштовна утиліта "touch", яка дозволяє змінювати штампи часу / дати та / або атрибути на одному або декількох файлах. Крім того, FS Touch може додавати / віднімати задану кількість секунд від існуючого часу файлу. Ви можете вказати, які файли та / або підкаталоги потрібно змінити за допомогою "складних масок файлів". Програму можна запускати з інтерактивного чи командного рядка. Нове у версії 7.2 - це перемикач командного рядка, щоб змінити змінену файлом часову марку +/- вказану кількість секунд.

FS Touch працює на ОС Windows XP, Vista, Windows 7 та Windows 8.


4

Цей вміст можна зберегти у reg-файлі. Це додасть контекстне меню правою кнопкою миші для всіх файлів із можливістю "Файл дотику" (тестовано на Windows 7). Скопіюйте всі наступні рядки у файл reg. Запустіть файл і затвердьте питання. Клацніть правою кнопкою миші на будь-якому файлі (або декількох файлах) - тепер доступна опція "Файл дотику"

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"

3

Якщо ви використовуєте git для одного або декількох проектів, команда mingw git-bashдля Windows має touchкоманду. Я хочу подякувати @ greg-hewgill за те, що він вказав на мене, що «nix утиліти існують для Windows, тому що саме це поклало мене на думку спробувати доторкнутися до git-bash.


3

спробуйте в PowerShell:

ni fileName.txt

NIє псевдонімом командлета New-Item .


1
Ласкаво просимо до SuperUser. Дякуємо за публікацію! Чи можете ви додати посилання на веб-сайт, який містить більше інформації про niкоманду, і, можливо, детальніше описати, що робить команда?
— hBy2Py

1
New-ItemКомандлет не може бути використаний для поновлення штампа часу існуючого файлу.
— Twisty Impersonator

Хоча він не оновлює часові позначки, він створює новий файл, і це стосується дотику. +1 від мене.
— MikeMurko

2

Збережіть наступне як touch.bat у папці% windir% \ system32 або додайте папку, в якій воно збережено, до змінної середовища PATH:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Використання зразка:

touch *.cpp
touch somefile.c

Довідка: Microsoft KB 69581


Відмінно! Жодних зовнішніх матеріалів, просто скопіюйте. І звичайно, більшість з нас потребує це як пакетна смуга :)
— Богдан Гаврил MSFT

2

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

vim foobar.txt +wq!

Аргумент "+" встановлює для запуску наступних команд. "wq!" це "писати, кинути, примушувати". Це відкриє файл, збережіть його та закрийте його відразу після цього.


Безглуздо складний, об'ємний і не портативний. -1
— MD XF

1

Спробуйте

fsutil файл createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- і це не так, як touchдля існуючих файлів.
— Кіт Томпсон

1

П'ять альтернатив, згаданих вище, плюс три ще не згадані тут, можна знайти на SuperUser: "Рекурсивна сенсорна команда Windows"


2
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
— Ян Скляренко

1

Це трохи не пов'язане з оригінальним запитанням, але я вважаю це дуже корисним для Windows через GUI.

Я використовую утиліту TouchPro, яка забезпечує графічний інтерфейс (вбудовується в оболонку Explorer):

http://www.jddesign.co.uk/products/touchpro/touchpro.htm


1

Ну, якщо ви дійсно хочете, щоб touchкоманда була доступною, ви можете помістити це в пакетний файл, який називається, touch.batі вставити його в C:\Windows:

TYPE NUL >>%1

Досить просто.


1

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

Тож "перетягування" відеофайлу на пакетний файл, FFMPEG запускається, потім "Дата створення" і "Дата зміни" з вхідного файлу копіюється у вихідний файл.

Спочатку це здавалося простим, поки ви не знайдете пакетні файли, які страшні при роботі з іменами файлів Unicode, вбудована PowerShell псується з символами імен файлів, а подвійне уникнення їх - це кошмар.

Моїм рішенням було зробити частину "touch" окремим сценарієм PowerShell, який я назвав "CLONE-FILE-DATE.ps1", і він містить:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Тоді ось приклад використання в моєму пакетному файлі "CONVERT.BAT":

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Я думаю, що PowerShell читабельна, тому я просто поясню пакетну розмову:

% ~ dp0 - поточний каталог пакетного файлу.

% ~ 1 - шлях файлу, скинутого на пакет без лапок.

CHCP 65001> nul встановлює символи на UTF-8 і проковтує вихід.

-ExecutionPolicy ByPass дозволяє запускати PowerShell без необхідності змінювати глобальну політику, яка існує для того, щоб люди не випадково запускали сценарії.


0

Люди Unix вирішили загальну проблему оновлення дати файлу будь-якого файлу за допомогою сенсорної команди. Однак для Windows іноді можливий більш простий метод для особливих випадків.

Мені потрібно оновити часову позначку ярлика програми в Windows 8.1, щоб змінити колір тла плитки програми видно, дивіться це питання ТАК . Замість того, щоб реалізувати один із розумних інструментів, описаних вище, мені простіше редагувати поле коментарів цього ярлика. Більшість людей залишає це порожнім, але, звичайно, корисний коментар швидко замислюється. І якщо коментар існує, додавання або видалення остаточного періоду ніколи не шкодить.


0

Я оцінюю це старе питання, я щойно виявив дотик до своєї системи Windows 10. Я завантажив і встановив Git звідси (я думаю), і схоже, що сенсорний і різні інші утиліти знаходяться в папці бін.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.