Windows-эквивалент команды Linux «Сенсорный»?

231703
facepalmd

Что вы используете, когда хотите обновить поле с измененной датой файла в Windows?

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

Изменить: здесь уже есть страница для приложений, как указано CheapScotsman здесь .

Если кто-нибудь знает, как я могу сделать это через C ++, C #, WSH или что-то подобное, ну и хорошо, иначе я бы подумал, что все остальное рассматривается в связанном вопросе.

153
http://stackoverflow.com/questions/210201/how-to-create-empty-text-file-from-a-batch-file упоминает загрузку, включая `REM.> a` barlop 9 лет назад 0
Четыре упомянутых выше варианта плюс еще четыре, не упомянутые здесь, можно найти в ответе на аналогичный вопрос: [«Windows Recursive Touch Command»] (http://superuser.com/questions/251470/windows-recursive-touch -команда / 251507 # 251507 «Рекурсивная сенсорная команда Windows») JdeBP 13 лет назад 0

30 ответов на вопрос

335
EM0

Если вы хотите прикоснуться к отметке даты файла в Windows, используйте следующую команду в командной строке:

copy /b filename.ext +,, 

(где имя filename.extвашего файла). Это +,,специальный флаг, copyуказывающий ему просто обновить дату / время в файле :

* Изменение времени и даты файла

Если вы хотите назначить текущее время и дату файлу без изменения файла, используйте следующий синтаксис:

copy /b Source+,,

Запятые указывают на пропуск параметра Destination.

Редактирование на основе комментариев Луми и Джастина: поместите это в пакетный файл, например. touch.cmd

@COPY /B %1+,, %1 

Это работает, даже если файл не находится в текущем каталоге (протестировано в Windows 7).

Это будет медленно, если файлы большие. mob 15 лет назад 4
Что это делает? Где это задокументировано? (Google не может индексировать «+ ,,», и сайт MS не ведет меня в правильном направлении, так как поиск по «копии» приводит к большому количеству ничего полезного.) Я имею в виду, что он прекрасно работает, и я возьму это много как само собой разумеющееся, но мне любопытно. dash-tom-bang 15 лет назад 44
Документация для `copy`: http://technet.microsoft.com/en-us/library/bb490886.aspx Joseph Hansen 13 лет назад 17
`type touch.bat` равно` @echo off`, а следующая строка `copy / b% 1 + ,,` - поместите его в `C: \ bin` или что у вас есть для ваших собственных скриптов, и затем вы сможете использовать его как `touch myfile.txt`. Lumi 13 лет назад 14
В Win7 это не будет работать, если вы не находитесь в папке, содержащей файл. Это создаст копию в текущем рабочем каталоге. 12 лет назад 17
@ Джейми, да, я тоже сталкиваюсь с этой проблемой. netawater 11 лет назад 0
@mob Обратите внимание, что это не было медленно для большого файла. Я использовал его для файла размером> 1 ГБ на сетевом диске, и он сразу же вернулся (и работал). Chadwick 11 лет назад 4
@Jamie: Не относится к Win7, относится ко всем ОС. Вы должны быть в текущем каталоге, поскольку ,, примет тот же файл без информации о пути (см. Ссылку на technet из комментария josmh) Mat M 11 лет назад 0
@Gish Domains: вы хотели бы рекламировать свой ответ в вики сообщества? Я думаю, что это очень полезно, хотя и не помечено как ответ. Mat M 11 лет назад 0
Я создал [GIST] (https://gist.github.com/tjbarbour/6356774), сочетающий этот ответ с [этим] (http://stackoverflow.com/questions/659647/how-to-get-folder- path-from-file-path-with-cmd) для автоматического добавления / pop назначения каталога TJB 11 лет назад 2
Пакетные файлы @TJB могут начинаться с `@echo OFF` drzaus 10 лет назад 1
Если вам нужно сделать это в удаленной папке (UNC-путь) - вы также должны указать место назначения для команды копирования - `copy / b Source + ,, Source` - где` Source` включает полный путь к файлу Justin 10 лет назад 5
`+ ,,`: http://blogs.msdn.com/b/oldnewthing/archive/2013/07/10/10432879.aspx thirtydot 10 лет назад 4
`Это будет медленно, если файлы большие. На самом деле, это не медленно, оно делает это менее чем за одну секунду, и даже не загорается индикатор HD-доступа. Очевидно, что команда `copy` в Windows имеет команду` touch`, специально закодированную в соответствии со статьей Technet. +1 Отличная находка; Я никогда не знал этого. Synetech 9 лет назад 1
Одна маленькая крошечная проблема: он копирует все файлы; это помещает их в CWD. Violet Giraffe 7 лет назад 0
Windows XP не любит копировать файл из-за пределов CWD. Для этого используйте `pushd"% ~ dp1% "` до CWD "touch" и `popd` после. (Если вы застряли, поддерживая одну из миллионов оставшихся машин XP ...) Tydaeus 7 лет назад 0
160
Greg Hewgill

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

Как и почти любой порт unix-to-windows, он не работает с символами Юникода в именах файлов за пределами кодировки, установленной по умолчанию для программ, не поддерживающих Юникод. Тестовое имя файла, которое запустит каждый такой инструмент: `" test тест τεστ.txt "` RomanSt 10 лет назад 1
У gnuwin32 есть это. но на самом деле, gnuwin32 также не работает для символов Юникода. barlop 8 лет назад 0
Обновление с 2017 года В Windows 10 мы можем использовать подсистему Linux для Windows, которая устанавливает bash. Нет необходимости в Cygwin, MinGW, Unxutils или любом другом частичном Unix для портов Windows. https://docs.microsoft.com/en-us/windows/wsl/install-win10 Davos 6 лет назад 0
92
ThiagoAlves

Если все, что вам нужно, это изменить дату последнего изменения файла (в моем случае):

C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date 
PowerShell FTW. Я имею в виду, серьезно, Unix это круто, но PS круче. matt 13 лет назад 8
Вы также можете обновить время последней записи для нескольких файлов / папок. 13 лет назад 1
Это будет работать только для одного файла. Для нескольких файлов: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date} Eli Algranti 12 лет назад 12
Если вы хотите сделать это рекурсивно, это работает довольно хорошо: gci -recu -inc "*. *" | % {$ _. LastWriteTime = Get-Date} BrainSlugs83 11 лет назад 2
Не уверен, почему, но звездочки не отображаются в моем комментарии выше - "." должно быть двойная кавычка, звездочка, точка, звездочка, двойная кавычка (вы знаете, «звезда-точка-звезда»). В любом случае, попытался найти справку, чтобы выяснить, почему, но теперь это не редактируется. Штопать. BrainSlugs83 11 лет назад 0
@ BrainSlugs83: используйте backticks `для кода:` gci -recu -inc "*. *" | % {$ _. LastWriteTime = Get-Date} ` alldayremix 11 лет назад 6
`touch` устанавливает время на конкретное или« сейчас », если оно не указано. `.LastWriteTime` - то же самое, поэтому вы можете сделать что-то вроде` .LastWriteTime = '12 / 30/99 23: 59'`. @matt: скорее всего, вы не очень знакомы с оболочкой * nix; PS, похоже, еще предстоит пройти долгий путь - например, `sed`? `Grep`? `Vi`? : p РЕДАКТИРОВАТЬ: Почему игнорируются мои Shift + Enter? Как добавить новые строки? void 10 лет назад 1
Unix Touch отлично подходит для своей простоты. Willmore 8 лет назад 0
52
bobbogo
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 + ,,`. Abel 12 лет назад 0
К сожалению, это не работает (по крайней мере, в Windows 7). Похоже, что интерпретатор команд не обновляет временную метку места назначения перенаправления, если файл фактически не изменен (т. Е. Нет данных для перенаправления). Synetech 9 лет назад 0
32
Faredoon

@ Тир-том- взрывы:

Вот объяснение Technet таинственных '+' и запятых:

копия / б Источник + ,,

Запятые указывают на пропуск параметра Destination.

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

И это ссылка на команду Technet по копированию: http://technet.microsoft.com/en-us/library/bb490886.aspx

Теперь это просто испортил синтаксис. Серьезно, * о чем они думали? * Также обратите внимание, что в той же документации написано «Место назначения: обязательно». Я поражен. sth 14 лет назад 16
Похоже, что это даже не работает в Vista ... Интересно, пришли ли они в себя? quillbreaker 14 лет назад 1
Работает в Windows 7 Imran 13 лет назад 1
Это сработало для меня даже без запятых: copy file.ext + Таким образом, документация так же далека от реального поведения, как и от любых разумных ожиданий. Abgan 13 лет назад 5
Он работал в Windows Server 2008, но только если вы находитесь в папке, содержащей файл FrinkTheBrave 12 лет назад 2
22
Fredrik Mörk

Если вы чувствуете, как кодирование его самостоятельно, .NET предлагает File.SetLastAccessTime, File.SetCreationTimeи File.SetLastWriteTimeметоды.

21
roger

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

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date} 
Менее многословный, но все же использующий только стандартные сокращения Powershell: `ls * -recurse | % {$ _. LastWriteTime = Get-Date} ` Jonas 7 лет назад 2
15
pkm

Я попытался это создать пустой файл в моем пакетном скрипте. Вы можете использовать это:

ECHO text>file1.txt 
Это самый лучший быстрый метод BY. Мне просто нужно было создать файл .gitignore, и Windows 7 продолжает жаловаться «необходимо ввести имя файла» и т. Д. И т. Д. `Echo pie> .gitignore` сработала - спасибо! 10 лет назад 3
@ Алекс Это не связано, но эта ошибка Windows, потому что файл начинается с точки. В Windows Explorer есть странный хак, чтобы обойти это: конец файла тоже заканчивается точкой. Поэтому введите `.gitignore`, и когда вы нажмете Enter, Windows удалит завершающий период. Сумасшедший, но это работает. Brad Cupit 9 лет назад 4
Я бы хотел, чтобы у меня было достаточно голосов, чтобы завоевать популярность крупных игроков. Jonathan Mee 8 лет назад 1
Это не создает пустой файл, хотя файл file1.txt содержит «текст». Joshua Meyers 7 лет назад 1
14
Dave Webb

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

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

13
Jon Galloway

Вот простой regfile, который я написал, чтобы добавить «сенсорный» щелчок правой кнопкой мыши в проводнике Windows . Также было бы легко написать скрипт, так как он просто вызывает:

cmd.exe /c copy %1+nul %1 /by 
И не забывайте `копировать nul some_file`, чтобы создать пустой файл (именно это я чаще всего использую для` touch`). Joey 15 лет назад 0
Ack! Zip file inaccessible (something about brinkster22.com needing to be the referring site). Jon, can you update this? Dan7119 13 лет назад 0
Работает на Win7. Не работает на WinXP: время файла остается тем же после выполнения «копирования». Egor Skriptunoff 8 лет назад 0