3

В Windows есть ли способ автоматически обновлять (или с помощью простого скрипта) дату папки с самой последней измененной датой любого из ее файлов (рекурсивно)?

7 ответов7

4

Вы можете сделать это в PowerShell. Примерно так, чтобы обновить текущую папку на основе файлов, которые она содержит непосредственно:

$lastModified = (dir . | ?{!$_.PSIsContainer} | sort LastWriteTime | select -last 1).LastWriteTime
$folder = get-item .
$folder.LastWriteTime = $lastModified

(Это не удастся, если в папке нет файлов или если у пользователя нет подходящих разрешений.)

РЕДАКТИРОВАТЬ: Убедитесь, что найден только один файл (последний), чтобы конвейер сортировки имел единственный результат.

2

Я только что сделал простой тест - если вы создаете пустой файл в каталоге, он изменяет дату изменения папки на это время. Когда вы удаляете файл, он все равно считается изменением, поэтому он остается измененным в это время.

Чтобы сделать это рекурсивно, вам нужно создать пустой файл в каждой папке, в которой вы хотите изменить дату. Это все еще довольно простое решение, если вы хотите заняться простым программированием.

Если вы хотите изменить дату на другое, отличное от текущего времени, это решение, очевидно, не будет работать.

1

Вы можете использовать Bulk File Changer.

BulkFileChanger - это небольшая утилита, которая позволяет создавать список файлов из нескольких папок, а затем выполнять с ними определенные действия - изменять их время создания / изменения / доступа, изменять атрибут файла (только для чтения, скрытый, системный), запускать исполняемый файл с эти файлы в качестве параметра, а также скопировать / вырезать вставить в проводнике.

альтернативный текст

0

Вот модифицированная версия ответа Ричарда. Это также скрипт PowerShell. Вместо установки времени изменения текущего каталога он устанавливает время изменения всех подкаталогов первого уровня текущего каталога. Другое отличие состоит в том, что он выглядит рекурсивно для последнего измененного времени. Надеюсь, что это полезно для кого-то еще.

$parentPath = Get-Location
Get-ChildItem | where {$_.PsIsContainer} | foreach {
    cd -LiteralPath $_.FullName
    $files = dir -Recurse . | where {-Not $_.PsIsContainer}
    if ($files.Count -eq 0) {
        echo "note: $($_.Name) contains no files"
    } else {
        $_.LastWriteTime = ($files | sort LastWriteTime | select -last 1).LastWriteTime
    }
}
cd -LiteralPath $parentPath
0

Ничего не делать! Миссия выполнена!

Дата последнего изменения папки всегда совпадает с датой последнего измененного файла в ней.

0

Не красиво, но функционально. Сделано в bash / cygwin

==================
find -maxdepth 1 -type d | grep -v "^\.$" | while read D ; do
  cd "$D"
  F=`ls -1tr | tail -1`
  cd ..
  touch -r "$D/$F" "$D"
done
==================

Брайан

0

FolderTimeUpdate

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

FolderTimeUpdate - это простой инструмент для Windows, который сканирует все файлы и папки в выбранной вами базовой папке и обновляет «Время изменения» каждой папки в соответствии с последним временем изменения файлов, хранящихся в ней.

Большая часть этого также может быть выполнена из командной строки, поэтому, возможно, вы можете автоматизировать ее, настроив ее на выполнение через определенные промежутки времени, или, возможно, даже контролировать определенные папки.

Графический интерфейс пользователя позволяет контролировать глубину подпапки для повторения, подстановочных знаков включения и исключения и даже для изменения времени создания файла (такого же, как время изменения или совпадения с самым старым временем создания или изменения).

Программа от превосходного и плодовитого Нира Софера (тот же автор Bulk File Changer в менее актуальном ответе).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .