Як я можу рекурсивно торкатися всіх файлів у каталозі (включаючи підкаталоги), щоб оновити штамп дати / часу?
Чи є у 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.) Однією з таких є 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.txt
find . -type f -exec touch {} \;
як трактується як:touch a.txt
touch b.txt
Таким чином, №1 набагато швидше (але також страждає від обмеження, що наступна команда exec
може мати лише один {}
заповнювач місця).