«Принятый» ответ в этой ссылке касается использования библиотек программирования .NET для выполнения этого для одного файла. Другие были о добавлении контекстного меню для обновления отдельных файлов. Я искал встроенную команду, чтобы сделать это с N файлами рекурсивно. Ответ ниже работал для всех файлов. Это не встроенный, но он работает. Благодарю.
JMQ
Это не дубликат Windows-версии Unix-сенсорной команды , потому что этот вопрос задается специально для рекурсии. Однако обратите внимание, что несколько ответов на этот вопрос имеют рекурсивные формы.
JdeBP
Ответы:
19
Есть несколько возможностей:
Используйте порт команды Unix touchи просто объедините findи touchUnix способом. Есть несколько вариантов. Чаще всего упоминаются GNUWin32 , cygwin и unxutils . Менее известными, но в некотором смысле лучше, являются инструменты из служебного инструментария SFUA , которые запускаются в Подсистеме для приложений на основе UNIX, которая поставляется в комплекте с Windows 7 Ultimate Edition и Windows Server 2008 R2. (Для Windows XP, можно загрузить и установить службы для UNIX версии 3.5 .) Этот инструментарий имеет большое количество командной строки TUI инструментов, от mvи duчерез оболочки Korn и C, чтобыperlи awk. Он выпускается в версиях x86-64 и IA64, а также x86-32. Программы работают в собственном POSIX-окружении Windows, а не с DLL-библиотеками эмулятора (такими как cygwin1.dll), наслоенными поверх Win32. И да, этот инструментарий имеет touchи find, а также около 300 других. Все эти наборы инструментов имеют общеизвестный недостаток: они, конечно, запускают отдельный процесс для каждого файла, к которому нужно прикоснуться. Это не проблема со следующими альтернативами.
Используйте одну из многих собственных touchкоманд Win32, которые люди написали и опубликовали. Многие из них поддерживают опции для выполнения рекурсии, без необходимости для Unix findобтекать их. (В конце концов, они нацелены на пользовательскую базу, которая ищет touchкоманду, потому что она не имеет полной загрузки перенесенных команд Unix.) Один из них - это Стефан Дюге, уtouch которого, как вы можете видеть, есть --recursiveопция.
Станьте умнее с тайными тайнами CMD. Как упомянуто в другом ответе, COPY /B myfile+,,будет обновляться дата последнего изменения файла, используя малоизвестный синтаксис команды «плюс» COPY(подробнее об этом можно узнать здесь , между прочим). Это, конечно, может быть объединено с FOR /Rвыполнением операции рекурсивно, как намекается в другом ответе здесь.
Используйте заменяющий интерпретатор команд и будьте менее умным и более простым, чем CMD. TCC / LE JP Software является одним из таких. Он добавляет /Sопцию к своей COPYкоманде , что означает, что можно использовать COPY /Sсинтаксис «плюс», чтобы исключить необходимость в FORобертке. Но это действительно все еще делает жизнь излишне трудной для себя, учитывая, что TCC / LE имеет встроенную команду TOUCH, которая напрямую поддерживает /Sопцию.
-1 Эти команды копируют файлы из подпапок в корень, и в результате получается беспорядок.
TonyG
1
+1 Небольшой поворот, чтобы исправить то, что сказал @TonyG: forfiles / S / C "cmd / c Copy / B nul: + ,,"
Алекс Дюпюи
не изменяется последнее изменение
beppe9000
4
Я знаю, что, возможно, уже слишком поздно, но, тем не менее, я оставлю свой ответ на тот случай, если кому-то еще понадобится то же самое.
Ответ Джона Т не сработал для меня в Windows 7. После некоторых исследований я нашел эту утилиту под названием SKTimeStamp , которая отлично справляется со своей задачей.
Или вы можете использовать инструменты, уже встроенные в Windows, когда у вас уже есть какой-нибудь «сенсорный» инструмент:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
ИЛИ
forfiles /P C:\Path\To\Root /S /C "touch @file"
(Примечание: если вы делаете это из пакетного файла и хотите использовать forкоманду, убедитесь, что вы используете двойные знаки процента для ваших переменных. (Например, %%iвместо %i)
-exec command ;
Выполнить команду; true, если возвращается 0 статус. Все последующие аргументы для поиска принимаются в качестве аргументов команды до аргумента, состоящего из ';' встречается. Строка '{}' заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find.
-exec command {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.
Ответы:
Есть несколько возможностей:
Используйте порт команды Unix
touch
и просто объединитеfind
иtouch
Unix способом. Есть несколько вариантов. Чаще всего упоминаются GNUWin32 , cygwin и unxutils . Менее известными, но в некотором смысле лучше, являются инструменты из служебного инструментария SFUA , которые запускаются в Подсистеме для приложений на основе UNIX, которая поставляется в комплекте с Windows 7 Ultimate Edition и Windows Server 2008 R2. (Для Windows XP, можно загрузить и установить службы для UNIX версии 3.5 .) Этот инструментарий имеет большое количество командной строки TUI инструментов, отmv
иdu
через оболочки Korn и C, чтобыperl
иawk
. Он выпускается в версиях x86-64 и IA64, а также x86-32. Программы работают в собственном POSIX-окружении Windows, а не с DLL-библиотеками эмулятора (такими какcygwin1.dll
), наслоенными поверх Win32. И да, этот инструментарий имеетtouch
иfind
, а также около 300 других.Все эти наборы инструментов имеют общеизвестный недостаток: они, конечно, запускают отдельный процесс для каждого файла, к которому нужно прикоснуться. Это не проблема со следующими альтернативами.
Используйте одну из многих собственных
touch
команд Win32, которые люди написали и опубликовали. Многие из них поддерживают опции для выполнения рекурсии, без необходимости для Unixfind
обтекать их. (В конце концов, они нацелены на пользовательскую базу, которая ищетtouch
команду, потому что она не имеет полной загрузки перенесенных команд Unix.) Один из них - это Стефан Дюге, уtouch
которого, как вы можете видеть, есть--recursive
опция.Станьте умнее с тайными тайнами CMD. Как упомянуто в другом ответе,
COPY /B myfile+,,
будет обновляться дата последнего изменения файла, используя малоизвестный синтаксис команды «плюс»COPY
(подробнее об этом можно узнать здесь , между прочим). Это, конечно, может быть объединено сFOR /R
выполнением операции рекурсивно, как намекается в другом ответе здесь.Используйте заменяющий интерпретатор команд и будьте менее умным и более простым, чем CMD. TCC / LE JP Software является одним из таких. Он добавляет
/S
опцию к своейCOPY
команде , что означает, что можно использоватьCOPY /S
синтаксис «плюс», чтобы исключить необходимость вFOR
обертке. Но это действительно все еще делает жизнь излишне трудной для себя, учитывая, что TCC / LE имеет встроенную команду TOUCH, которая напрямую поддерживает/S
опцию.источник
COPY /B file+,,
это путь, не требующий дополнительных(ls file).LastWriteTime = DateTime.now
Поскольку они доступны, я бы порекомендовал воспользоваться unxutils . Они включают в себя
find
иtouch
команды , которые будут делать это очень легко.После перехода в самый верхний каталог вы хотите изменить:
источник
Чтобы использовать только существующие функциональные возможности Windows (ничего лишнего для установки), попробуйте один из них:
(рекурсивно «трогать» все файлы, начиная с указанного пути)
ИЛИ
(рекурсивно «трогать» все файлы, начиная с текущего каталога)
источник
Я знаю, что, возможно, уже слишком поздно, но, тем не менее, я оставлю свой ответ на тот случай, если кому-то еще понадобится то же самое.
Ответ Джона Т не сработал для меня в Windows 7. После некоторых исследований я нашел эту утилиту под названием SKTimeStamp , которая отлично справляется со своей задачей.
Вот статья с более подробной информацией о том, как это работает: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -доступ / .
Вот шаги, которые вам нужно выполнить:
Вуаля! Все ваши файлы были обновлены! Не нужно никаких утилит Unix или командных строк.
источник
Или вы можете использовать инструменты, уже встроенные в Windows, когда у вас уже есть какой-нибудь «сенсорный» инструмент:
ИЛИ
(Примечание: если вы делаете это из пакетного файла и хотите использовать
for
команду, убедитесь, что вы используете двойные знаки процента для ваших переменных. (Например,%%i
вместо%i
)источник
Это не удалось на Windows 7 для меня тоже. Я использовал другой синтаксис и получил его на работу:
Обратите внимание, я не использовал опцию recurse.
источник
Использование powershell:
источник
The property 'LastWriteTime' cannot be found on this object.
Ссылаясь на ответ Джона Т выше:
Я пытался понять разницу между завершением
find
exec-команды a символом a\;
и `+ '(я не знал о последнем).Это было полезно: ( отсюда )
-exec command ;
Выполнить команду; true, если возвращается 0 статус. Все последующие аргументы для поиска принимаются в качестве аргументов команды до аргумента, состоящего из ';' встречается. Строка '{}' заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find.
-exec command {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.
Рассмотрим папку,
c:\myfolder
содержащую 2 файлаa.txt
иb.txt
find . -type f -exec touch {} +
интерпретируется как:touch a.txt b.txt
Это похоже на работу xargs
find . -type f -exec touch {} \;
как интерпретируется как:touch a.txt
touch b.txt
Таким образом, # 1 намного быстрее (но также страдает от ограничения, что следующая команда
exec
может иметь только один{}
заполнитель).источник
Использование PowerShell для текущего каталога и всех его подкаталогов:
Или вы можете указать папку сразу после
dir
.источник