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


17

Як я можу рекурсивно торкатися всіх файлів у каталозі (включаючи підкаталоги), щоб оновити штамп дати / часу?

Чи є у Windows 7 механізм для цього?



"Прийнята" відповідь у цьому посиланні стосується використання бібліотек програмування .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.) Однією з таких є Stéphane Duguay,touch котра, як бачите, має --recursiveможливість.

  • Будьте розумні з таємничими таємницями CMD. Як згадується в іншій відповіді, COPY /B myfile+,,оновимо дату останньої модифікації файлу, використовуючи маловідомий синтаксис COPYкоманди «плюс» (докладніше про це можна знайти тут , до речі). Це, звичайно, може бути поєднано з FOR /Rвиконанням операції рекурсивно, про що натякає інша відповідь тут.

  • Використовуйте інтерпретатор команд заміни і будьте менш розумними та простішими, ніж CMD. TCC / LE JP Software JP Software є одним з таких. Він додає /Sопцію до своєї COPYкоманди , тобто означає, що можна використати COPY /Sсинтаксис "плюс", щоб усунути потребу в FORобгортці. Але це дійсно все ще робить життя надмірно складним для себе, враховуючи, що TCC / LE має вбудовану команду TOUCH, яка безпосередньо підтримує /Sпараметр.


2
+1, COPY /B file+,,шлях, який потрібно пройти, не вимагає додаткових послуг ... :-)
Tamara Wijsman

3
Шлях до Powershell:(ls file).LastWriteTime = DateTime.now
Тамара Війсман

5

Оскільки вони легко доступні, я б рекомендував скористатись утилітами . Вони включають в себе команди 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: + ,,"
Alex Dupuis

не змінюється останньої модифікації
beppe9000

4

Я знаю, що це, мабуть, трохи пізно, але все ж я залишу свою відповідь на випадок, якщо комусь іншому потрібно те саме.

Відповідь Джона Т не працювала для мене в Windows 7. Після деяких досліджень я знайшов цю утиліту під назвою SKTimeStamp , яка виконує цю роботу ідеально.

Ось стаття з більш детальною інформацією про те, як вона працює: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-create-modified-and -доступний / .

Ось такі дії, які потрібно виконати:

  • Встановіть додаток
  • Перейдіть до каталогу, де вам потрібно було змінити часові позначки
  • Шукайте * у вікні пошуку, щоб провідник показував усі файли
  • Коли всі файли знайдені, виберіть їх усі, клацніть правою кнопкою миші та виберіть "Властивості"
  • У діалозі виберіть вкладку «Часові позначки»
  • Налаштуйте дати та час за потребою та натисніть на сенсорне

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


1

Або ви можете використовувати інструменти, вже вбудовані в Windows, як тільки у вас є якийсь інструмент "touch":

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

АБО

forfiles /P C:\Path\To\Root /S /C "touch @file"

(Примітка. Якщо ви робите це з пакетного файлу і хочете використовувати forкоманду, обов'язково використовуйте подвійні відсотки знаків для своїх змінних. (Наприклад, %%iзамість %i)


1

Не вдалося в Windows 7 і для мене. Я використовував різні синтаксиси і змусив його працювати:

forfiles /c "cmd /c touch @file"

Зауважте, я не використовував параметр рекурсу.


1

Використовуючи паттерн повноважень:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

Для мене це не працює:The property 'LastWriteTime' cannot be found on this object.
Ben N

Він працював для мене в Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves

0

Посилаючись на відповідь Джона Т. вище:

Я намагався зрозуміти різницю між закінченням команди find's exec на a \;і' + '(я не знав останнього).

Це було корисно: ( звідси )

-exec command ;
Виконати команду; вірно, якщо статус 0 повернуто. Усі наступні аргументи для пошуку вважаються аргументами команди, поки аргумент не складається з ';' зустрічається. Рядок '{}' замінюється поточним ім'ям файлу, який обробляється скрізь, де він зустрічається в аргументах команди, а не лише в аргументах, де він один, як у деяких версіях знаходження.

-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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.