Ситуация такова. Мне нужно отредактировать много разных файлов в папке, но потом дата изменения поменяется, нарушится логика сортировки файлов по датам
Есть, конечно, обходы:
а) для единичных файлов скрипт или программа для изменения тэгов
б) можно переименовать все файлы в формат, состоящий из даты изменения, но это очень ситуативный метод (ну вон картинки в папке так можно, имена файлов там не важны)
Но хотелось бы решение на уровне файловой системы, если такое вообще возможно
На Raspberry Pi в настройках загрузчика можно прописать noatime для раздела ext4, это дата доступа к файлам, может, есть аналог в Windows на дату изменения файлов, но я ничего применимого для массового редактирования не нашёл
Это все костыли и решение проблем XY из-за хранения файлов кучей в файловой системе.
Если вам нужна полноценная работа с данными - нужна система, которая хранит информацию о файлах, оставляя файловой системе только собственно хранение.
noatime не позволяет отредактировать файл без изменения его даты модификации - mtime.
Он просто отключает запись atime - даты последнего доступа к файлу (в т.ч. и на чтение).
Adamos, Понял, спасибо. Да, хранится иногда как попало, есть такое, но чтобы рассортировать, как раз надо отредактировать и разложить желательно по датам
Refguser, обычно датой создания становится дата копирования файлов на ПК, поэтому это не очень достоверная информация. Когда из выкачиваешь с телефона, например
Написать скрипт, который сделает то, что вам нужно. Сначала получаете список: файл плюс дата и время. Далее редактируете, а после проходите по этому списку, например с помощью nircmd -> setfiletime для возврата даты. Можно написать бантик/шелл скрипт или использовать любой автоматизатор. Для получения и изменения даты файла используется WinAPI вызовы GetFileTime и SetFileTime.
Ха? Плюсы, да ещё питон? Зачем так усложнять-то? Да там же пяток-десяток строк кода для шелла или любого автоматизатора. Впрочем, если работает — то и ладно...
Передаёте ему путь (папку) и файл.csv куда сохранить список с датами - сохраняет их.
Передаёте только файл.csv - восстанавливает даты всем файлам из этого .csv
alzneo, отлично, спасибо, только сейчас разобрался с этим. Действительно, очень легко работает)
Записать время powershell .\time.ps1 "V:/" "V:/times.csv"
Восстановить время powershell .\time.ps1 "V:/times.csv"
winitpro.ru изменение параметров файла через powershell
Ps в линуксе для ntfs noatime тоже работает
Pss Нативная блокировка обновления даты изменения файлов (Last Modified) в NTFS невозможна, так как это критическая функция ведения журнала файловой системы
Vitaliy Ivanov, Я б просто сделал в два прохода - сначала modifytime -> creationtime, чтобы зафиксировать оригинальное значение вместо даты копирования извне, а потом после изменений обратно creationtime -> modifytime
два однострочника на powershell
MaxKozlov, о, действительно интересный подход. Потому что в способе с моими скриптами нельзя менять имена файлов одновременно с редактированием. Спасибо, тоже обдумаю, как лучше организовать
попробуйте symbolic link ссылки на файл, создав символические ссылки на файлы, изменив их в исходном месте (или открыв по симлинку), не изменит метаинформацию о времени в симлинке... т.е. однократно сделав симлинки на все ваши файлы, и в последствии работая с этими симлинками, даты у этих симлинков меняться не будут (они будут меняться у оригинальных файлов).
делать с помощью mklink исходный_файл имя_симлинка
симлинки делать можно с тем же именем но в другом каталоге
p.s. с ключом /h будут созданы hardlink (только в пределах одного физического тома, когда как симлинки могут быть на другом ntfs томе), работают они по другому, вроде бы дата изменения у них должна так же меняться, советую протестировать поведение, для собственной справки...
Спасибо, попробовал. К сожалению, всё-таки даты изменения меняются:
а) у оригинала, если открыть и изменить симлинк
б) у симлинка, если открыть и изменить оригинал
Vitaliy Ivanov, покажите, каким кодом вы смотрите, потому что у меня это работает
p.s. некоторые утилиты автоматически разименовывают симлинки поэтому делайте это исходными методами операционной системы
Вот пример для windows scripting host (работает на всех версиях windows начиная где то с win98)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.GetFile("test.orig");
WScript.Echo(file.DateLastModified); // дата/время последнего изменения
так вот для симлинка он возвращает всегда дату создания симлинка (это можно изменить)... и при этом открытие симлинка вызывает открытие файла любыми методами