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.