Як я можу рекурсивно торкатися всіх файлів у каталозі (включаючи підкаталоги), щоб оновити штамп дати / часу?
Чи є у Windows 7 механізм для цього?
Як я можу рекурсивно торкатися всіх файлів у каталозі (включаючи підкаталоги), щоб оновити штамп дати / часу?
Чи є у Windows 7 механізм для цього?
Відповіді:
Є кілька можливостей:
Використовуйте порт команди 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параметр.
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-create-modified-and -доступний / .
Ось такі дії, які потрібно виконати:
Вуаля! Усі ваші файли оновлено! Не потрібно ніяких утилітів або командних рядків Unix.
Або ви можете використовувати інструменти, вже вбудовані в 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)
Використовуючи паттерн повноважень:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
Посилаючись на відповідь Джона Т. вище:
Я намагався зрозуміти різницю між закінченням команди find's exec на a \;і' + '(я не знав останнього).
Це було корисно: ( звідси )
-exec command ;
Виконати команду; вірно, якщо статус 0 повернуто. Усі наступні аргументи для пошуку вважаються аргументами команди, поки аргумент не складається з ';' зустрічається. Рядок '{}' замінюється поточним ім'ям файлу, який обробляється скрізь, де він зустрічається в аргументах команди, а не лише в аргументах, де він один, як у деяких версіях знаходження.
-exec command {} +
Цей варіант дії -exec виконує вказану команду на вибраних файлах, але командний рядок будується додаванням кожного вибраного імені файлу в кінці; загальна кількість викликів команди буде значно меншою, ніж кількість відповідних файлів. Командний рядок побудований приблизно так само, як xargs будує свої командні рядки. У команді допускається лише один екземпляр "{}". Команда виконується в початковому каталозі.
Розглянемо папку, c:\myfolderщо містить 2 файли a.txtтаb.txt
find . -type f -exec touch {} +трактується як: touch a.txt b.txtfind . -type f -exec touch {} \;як трактується як:touch a.txttouch b.txtТаким чином, №1 набагато швидше (але також страждає від обмеження, що наступна команда execможе мати лише один {}заповнювач місця).