Читатель Алексей озадачил меня в почте проблемой бюджетных автомобильных FM-трансмиттеров. Цитирую его задачу с незначительными правками и моим скриншотом для иллюстрации.
Задача
Некоторые бюджетные автомобильные FM-трансмиттеры со встроенным MP3-плеером умеют воспроизводить файлы только в порядке по дате создания/изменения. Если их скачать на диск, например, торрент-клиентом и перебросить на флэшку — всё нормально.
Но если сначала сохранить на какое-то сетевое хранилище под Linux, а потом опять же по сети с него записать на флэшку — всё перемешивается. Файл с названием 001 может оказаться 5-м по дате изменения, а с названием 009 — первым.
Вы, как опытный пользователь каталогов и библиотек, можете ли подсказать как в Windows 7 восстановить правильную сортировку, а именно: взять порядок нумерации файлов по имени, и по нему создать признак по дате?
Решение
Алексей ожидал от меня решения в плоскости проводника Windows, но я прямо с телефона написал такой ванлайнер PowerShell:
dir c:\folder -file | sort -property name | %{$_.LastWriteTime = Get-Date}
Процесс несложный:
- Get-ChildItem (dir) получает список файлов в папке и передает его по конвейеру.
- Sort-Object (sort) сортирует список по имени файла и передает дальше.
- Foreach-Object (%) устанавливает для каждого объекта ($_.) свойство LastWriteTime (дата изменения) равное текущей дате, которую выдает командлет Get-Date.
Если нужно изменять дату создания, используется свойство CreationTime.
В результате папка будет выглядеть примерно так. Проводник показывает дату с точностью до минуты, но и секунды будут одинаковыми.
Поскольку у файлов одинаковая дата изменения, трудно сказать, как поведет себя устройство воспроизведения. Не исключено, что оно будет проигрывать файлы в обратном порядке, начиная с наибольшего номера.
Можно немного допилить скрипт, чтобы даты изменения файлов отличались. Для этого надо добавить для командлета Foreach-Object в начале блок со счетчиком {$i=0}
и изменить вывод даты на (Get-Date).AddSeconds($i)
dir c:\folder -file | sort -property name | %{$i=0} {$_.LastWriteTime = (Get-Date).AddSeconds($i); $i++}
Теперь для каждого файла задается дата изменения, которая равна текущей дате плюс i секунд, где i – порядковый номер файла в списке. Можно добавлять минуты, часы, дни и т.д.
Для наглядности результат с шагом в одну минуту с помощью AddMinutes($i)
.
Алексей ответил, что он не программист, а электронщик, и не знает с чем едят PowerShell и куда пихать скрипты. А получив дополнительную порцию объяснений, он, к сожалению, так и не сообщил, сумел ли применить это решение. Однако я все равно решил его опубликовать, потому что оно может пригодиться чуть более пытливым читателям :)
Lecron
Действительно красиво. Читать. C пользоваться, не все так очевидно. Особенно пользоваться регулярно. Нужна интеграция в GUI. А еще лучше, срабатывание по событию. Например по факту размонтирования флешки.
Николай
Ничего не знаю про PowerShell, но, наверно, можно записать команды в батник, заменив «c:\folder» на «%1» и просто кидать на него папку с .mp3. Элементарно, Ватсон. :)
Lecron
Согласен. Просто вижу ошибку не в решении задачи, а в постановке. Не что нужно делать, а что нужно Сделать один раз, чтобы всегда слушать по порядку. Подзадача решена. Теперь надо решить задачу.
Vadim Sterkin
Ошибку? Гм… В чем конкретно вы видите задачу и решение?
GUI ради GUI тут не нужен, потому что папка с файлами одна и та же тут (либо может быть такой). Нет ничего проще двойного щелчка по файлу…
Николай
Алексей, конечно, свинтус. Не понимаю таких людей.
Сделать одинаковую дату у всех .mp3 действительно можно очень просто в проводнике. Выделяем нужные файлы, открываем Свойства, Подробно и задаем какое-либо несущественное свойство, например, «Настроение». Вуаля, у всех файлов одинаковая дата. А уж поможет ли это Алексею с его трансмиттером — не знаю.
Vadim Sterkin
Зачёт! Но вот у меня тоже были сомнения в поведении устройства при одинаковой дате.
Павел Онищенко
Есть устойчивое подозрение, что в этом случае очерёдность будет браться из FAT.
Павел Нагаев
Вадим, у меня задача была mp3 присвоить уникальные номера, чтобы потом можно было проиграть композицию по номеру, а не по названию, файлы названы как попало. Помню сидел на парковке в Севастополе в машине и писал скрипт на нетбуке, чтобы перед поездкой домой, в Новороссийск можно было музыку нормально слушать :-)
А то дочь просит включить музыкальную композицию, а какую объяснить не может, а так — номер 215 :-)
Vadim Sterkin
Паша, счетчик был в связанной статье.
artem
Очень хитровымученная задача. Первый раз слышу, чтобы живому человеку номера были проще, чем названия. У тебя дочь не робот случайно? И к тому же, откуда она знает, что нужная композиция — 215?
Или она всегда хотела только 215? :)
Vadim Sterkin
Вероятно, присвоить номер — это добавить номер в начале, а не заменить название на номер :)
Lecron
Уже ответил. Настроить систему так, чтобы больше об этом вопросе не вспоминать.
Как? Слишком общий вопрос. Телепатия не настолько развита. Если настройки самбы (а они там есть) или винды (скорее всего тоже есть) не позволяют решить c датами, попробовать доступ по ftp (благо с ним в можно работать прямо из проводника и закреплять в быстрый доступ), webDAV или что там еще поддерживает сервер. Если и это не помогло, что вряд ли, думать об автоматизации запуска переименования. А может наоборот, вначале автомтизация, а потом остальное. А может еще какие варианты существуют. Повторю, я не телепат.
Vadim Sterkin
Ясно. Есть такое понятие как целесообразность. Оно от многих факторов зависит, но исходя из имеющихся сведений, я считаю, что мой скрипт — в самый раз :)
Игорь
Супер! просто и элегантно. давно искал что-то подобное. редактирую свои сборники в TagScanner, записываю на флешку и использую Ваш скрипт с AddMinutes($i). моя автомагнитола стала воспроизводить все по порядку. спасибо!
Vadim Sterkin
Рад, что помогло! Я когда-то очень давно сам сталкивался с подобным, но как решал не помню. PowerShell я тогда не владел, так что, наверное, в Total Commander.
dl
Дата изменения будет одинаковой не для всех файлов:
Vadim Sterkin
Согласен, формально — дата различается кое-где. Но опять же, мы имеем дело с бюджетным автомобильным трансмиттером… С точностью до минуты он точно должен различать :)