Windows рекурсивная сенсорная команда

17

В Windows 7 как можно рекурсивно коснуться всех файлов в каталоге (включая подкаталоги), чтобы обновить отметку даты / времени?

Есть ли в Windows 7 механизм для достижения этой цели?

jmq
источник
возможный дубликат Windows, эквивалентный команде Linux «touch»?
Приостановлено до дальнейшего уведомления.
«Принятый» ответ в этой ссылке касается использования библиотек программирования .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опцию.

JdeBP
источник
2
+1, COPY /B file+,,это путь, не требующий дополнительных
расходов
3
Способ Powershell:(ls file).LastWriteTime = DateTime.now
Тамара Вийсман
5

Поскольку они доступны, я бы порекомендовал воспользоваться unxutils . Они включают в себя findи touchкоманды , которые будут делать это очень легко.

После перехода в самый верхний каталог вы хотите изменить:

находить . -типа f -exec touch {} +
Джон Т
источник
5

Чтобы использовать только существующие функциональные возможности Windows (ничего лишнего для установки), попробуйте один из них:

forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"  

(рекурсивно «трогать» все файлы, начиная с указанного пути)

ИЛИ

forfiles /S /C "cmd /c Copy /B @path+,,"   

(рекурсивно «трогать» все файлы, начиная с текущего каталога)

Свен Роупке
источник
3
-1 Эти команды копируют файлы из подпапок в корень, и в результате получается беспорядок.
TonyG
1
+1 Небольшой поворот, чтобы исправить то, что сказал @TonyG: forfiles / S / C "cmd / c Copy / B nul: + ,,"
Алекс Дюпюи
не изменяется последнее изменение
beppe9000
4

Я знаю, что, возможно, уже слишком поздно, но, тем не менее, я оставлю свой ответ на тот случай, если кому-то еще понадобится то же самое.

Ответ Джона Т не сработал для меня в Windows 7. После некоторых исследований я нашел эту утилиту под названием SKTimeStamp , которая отлично справляется со своей задачей.

Вот статья с более подробной информацией о том, как это работает: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -доступ / .

Вот шаги, которые вам нужно выполнить:

  • Установить приложение
  • Перейдите в каталог, где вам нужно изменить метки времени
  • Ищите * в поле поиска, чтобы проводник отображал все файлы
  • Когда все файлы найдены, выберите их все, щелкните по ним правой кнопкой мыши и выберите «Свойства».
  • В диалоговом окне выберите вкладку TimeStamps.
  • Настройте свои даты и время по мере необходимости и нажмите на Touch

Вуаля! Все ваши файлы были обновлены! Не нужно никаких утилит Unix или командных строк.

Андрис
источник
1

Или вы можете использовать инструменты, уже встроенные в 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)

afrazier
источник
1

Это не удалось на Windows 7 для меня тоже. Я использовал другой синтаксис и получил его на работу:

forfiles /c "cmd /c touch @file"

Обратите внимание, я не использовал опцию recurse.

jemiah
источник
1

Использование powershell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
источник
Это не работает для меня:The property 'LastWriteTime' cannot be found on this object.
Бен N
У меня это работало в Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves
0

Ссылаясь на ответ Джона Т выше:

Я пытался понять разницу между завершением findexec-команды a символом a \;и `+ '(я не знал о последнем).

Это было полезно: ( отсюда )

-exec command ;
Выполнить команду; true, если возвращается 0 статус. Все последующие аргументы для поиска принимаются в качестве аргументов команды до аргумента, состоящего из ';' встречается. Строка '{}' заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где он один, как в некоторых версиях find.

-exec command {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs создает свои командные строки. В команде допускается только один экземпляр «{}». Команда выполняется в начальном каталоге.

Рассмотрим папку, c:\myfolderсодержащую 2 файла a.txtиb.txt

  1. find . -type f -exec touch {} +интерпретируется как:
    touch a.txt b.txt
    Это похоже на работу xargs

  2. тогда find . -type f -exec touch {} \;как интерпретируется как:
    touch a.txt
    touch b.txt

Таким образом, # 1 намного быстрее (но также страдает от ограничения, что следующая команда execможет иметь только один {}заполнитель).

Ашутош Джиндал
источник
Отличный комментарий с хорошей информацией, но не ответ на вопрос. Было бы +1, если бы это был комментарий.
TonyG
1
:) У меня нет воспоминаний о создании этого поста :)
Ашутош Джиндал
0

Использование PowerShell для текущего каталога и всех его подкаталогов:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

Или вы можете указать папку сразу после dir.

icl7126
источник