В Windows 7 как можно рекурсивно коснуться всех файлов в каталоге (включая подкаталоги), чтобы обновить отметку даты / времени?
Есть ли в Windows 7 механизм для достижения этой цели?
В Windows 7 как можно рекурсивно коснуться всех файлов в каталоге (включая подкаталоги), чтобы обновить отметку даты / времени?
Есть ли в Windows 7 механизм для достижения этой цели?
Ответы:
Есть несколько возможностей:
Используйте порт команды 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, которые люди написали и опубликовали. Многие из них поддерживают опции для выполнения рекурсии, без необходимости для 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
опцию.
COPY /B file+,,
это путь, не требующий дополнительных
(ls file).LastWriteTime = DateTime.now
Чтобы использовать только существующие функциональные возможности Windows (ничего лишнего для установки), попробуйте один из них:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
(рекурсивно «трогать» все файлы, начиная с указанного пути)
ИЛИ
forfiles /S /C "cmd /c Copy /B @path+,,"
(рекурсивно «трогать» все файлы, начиная с текущего каталога)
Я знаю, что, возможно, уже слишком поздно, но, тем не менее, я оставлю свой ответ на тот случай, если кому-то еще понадобится то же самое.
Ответ Джона Т не сработал для меня в 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 /r %i in (C:\Path\To\Root\*) do @touch "%i"
ИЛИ
forfiles /P C:\Path\To\Root /S /C "touch @file"
(Примечание: если вы делаете это из пакетного файла и хотите использовать for
команду, убедитесь, что вы используете двойные знаки процента для ваших переменных. (Например, %%i
вместо %i
)
Использование powershell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
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
find . -type f -exec touch {} \;
как интерпретируется как:touch a.txt
touch b.txt
Таким образом, # 1 намного быстрее (но также страдает от ограничения, что следующая команда exec
может иметь только один {}
заполнитель).