Войти

Показать полную графическую версию : [решено] Сортирование файлов по папкам (копирование по дате создания)


Страниц : [1] 2

DIMM2005
28-06-2007, 22:10
Подскажите программку (или скрипт какой-то), которая может определить дату создания файла и судя по ней переместить файл в папку с названием "Дата создания файла".

Например:
файл1.jpg - дата создания 3.05.2007

Нужно создать папку 03.05.2007 (или 2007.05.03) и скопировать туда "файл1.jpg".

Пробовал искать по Инету - честно слово, ничего не нашел. А согласитесь, такая программа полезная. У меня фотки с камеры (Canon) когда сливаются на комп сразу по папкам сортируются. А вот на мобильном все файлы в одну папку скидываются и когда на комп перекинешь - то такой бардак

Может тут есть программисты, для которых это не тяжело сделать :) А то я только очень начинающий.

Petya V4sechkin
29-06-2007, 12:48
DIMM2005
Можно сделать vbs-скрипт примерно такого содержания:
Dim FSO, FldN, Fls, Fl, DtN, FlN
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 0 Then
MsgBox "Не задано имя папки для распределения файлов по датам. ", vbExclamation, "Ошибка"
WScript.Quit
End If

FldN = WScript.Arguments(0)
If Not FSO.FolderExists(FldN) Then
MsgBox "Папка """ & FldN & """ не существует. ", vbExclamation, "Ошибка"
WScript.Quit
End If

Set Fls = FSO.GetFolder(FldN).Files
For Each Fl In Fls
DtN = FSO.BuildPath(FldN, GetDateName(Fl.DateLastModified))
If Not FSO.FolderExists(DtN) Then FSO.CreateFolder DtN

FlN = FSO.BuildPath(DtN, Fl.Name)
If FSO.FileExists(FlN) Then FSO.DeleteFile FlN, True
Fl.Move FlN
Next

MsgBox "Скрипт завершен. ", vbInformation, "Финиш"
WScript.Quit

Private Function GetDateName(Dt)
Dim M, D

M = Month(Dt)
D = Day(Dt)
If M < 10 Then M = "0" & M
If D < 10 Then D = "0" & D

GetDateName = Year(Dt) & "-" & M & "-" & D
End Function
Сохранить с расширением .vbs, например DTMove.vbs.
Формат вызова:
DTMove.vbs Имя_папки

P. S. С контролем ошибок не заморачивался, так что использовать аккуратно.

DIMM2005
29-06-2007, 18:10
Petya V4sechkin

Спасибо! Все работает, сортирует как надо. Вроде проверял, при разных условиях - все ок... Я как понял скрипт берет дату изменения файла, а не создания, что впринципе мне и нужно. (т.к. при копировании на комп, дата создания меняется, а дата изменения - нет).

Вот только маленький недочет. Скрипт заменяет одинаковые файлы (если имя совпадает и папка назначения). Хотя содержимое файла может быть разным. Я понимаю, в реальной жизни, такое врятли получится, но..... Можно как-то доработать скрипт, что если при сортировании, файл с таким именем уже существует, то переместить его в папку, например "Непонятное". Чтобы я потом посмотрел и лично все досортировал.

Vadikan
29-06-2007, 19:30
Petya V4sechkin
Благодарю!

Petya V4sechkin
29-06-2007, 19:39
Vadikan
Не за что ;)


DIMM2005
Вот только маленький недочет. Скрипт заменяет одинаковые файлы (если имя совпадает и папка назначения).Тогда так (с запросом на перезапись):
Dim FSO, FldN, Fls, Fl, D, DtN, FlN
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 0 Then
MsgBox "Не задано имя папки для распределения файлов по датам. ", vbExclamation, "Ошибка"
WScript.Quit
End If

FldN = WScript.Arguments(0)
If Not FSO.FolderExists(FldN) Then
MsgBox "Папка """ & FldN & """ не существует. ", vbExclamation, "Ошибка"
WScript.Quit
End If

Set Fls = FSO.GetFolder(FldN).Files
For Each Fl In Fls
D = GetDateName(Fl.DateLastModified)
DtN = FSO.BuildPath(FldN, D)
If Not FSO.FolderExists(DtN) Then FSO.CreateFolder DtN

FlN = FSO.BuildPath(DtN, Fl.Name)
If FSO.FileExists(FlN) Then
If MsgBox("Файл """ & Fl.Name & """ уже существует в папке """ & D & """. " & vbCr & "Перезаписать?", vbQuestion + vbOKCancel, "Внимание") = vbOK Then
FSO.DeleteFile FlN, True
Fl.Move FlN
End If
Else
Fl.Move FlN
End If
Next

MsgBox "Скрипт завершен. ", vbInformation, "Финиш"
WScript.Quit

Private Function GetDateName(Dt)
Dim M, D

M = Month(Dt)
D = Day(Dt)
If M < 10 Then M = "0" & M
If D < 10 Then D = "0" & D

GetDateName = Year(Dt) & "-" & M & "-" & D
End Function

DIMM2005
29-06-2007, 21:33
Спасибо! Лучше я бы и не мог придумать.

Petya V4sechkin Можешь толкать как комерческий продукт :) Ведь честно, в Инете ничего подобного не нашел. Только вот "фомат вызова: DTMove.vbs Имя_папки" не все могут понять :) Сегодня наверно тему в сети создам, многим этот скрипт понравится - авторство конечно за тобой :) Это я упомяну...

Petya V4sechkin
29-06-2007, 21:57
DIMM2005
Можешь толкать как комерческий продукт :)Хе-хе, в продукте 40 строчек кода :)

Только вот "фомат вызова: DTMove.vbs Имя_папки" не все могут понять :)Типа, можно Drug & Drop :) Запускаем Проводник Windows и левой кнопкой мыши кидаем папку на скрипт.
Конечно, лучше было бы сделать, чтобы при отсутствии параметра скрипт спрашивал путь к папке, но я об этом не подумал.

Suprus
18-11-2010, 10:09
Добрый день!
Подскажите как реализовать, сортировку файлов по папкам (по ВРЕМЕНИ создания, не по дате, т.е чтобы скрипт создавал новые папки по формату ЧЧ-ММ и туда сортировал файлы).

Suprus
18-11-2010, 12:08
Вопрос решен.
Может пригодится кому-нибудь..




Dim FSO, FldN, Fls, Fl, D, DtN, FlN
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 0 Then
MsgBox "Не задано имя папки для распределения файлов по датам. ", vbExclamation, "Ошибка"
WScript.Quit
End If

FldN = WScript.Arguments(0)
If Not FSO.FolderExists(FldN) Then
MsgBox "Папка """ & FldN & """ не существует. ", vbExclamation, "Ошибка"
WScript.Quit
End If

Set Fls = FSO.GetFolder(FldN).Files
For Each Fl In Fls
D = GetTimeName(Fl.DateLastModified)
DtN = FSO.BuildPath(FldN, D)
If Not FSO.FolderExists(DtN) Then FSO.CreateFolder DtN

FlN = FSO.BuildPath(DtN, Fl.Name)
If FSO.FileExists(FlN) Then
If MsgBox("Файл """ & Fl.Name & """ уже существует в папке """ & D & """. " & vbCr & "Перезаписать?", vbQuestion + vbOKCancel, "Внимание") = vbOK Then
FSO.DeleteFile FlN, True
Fl.Move FlN
End If
Else
Fl.Move FlN
End If
Next

MsgBox "Скрипт завершен. ", vbInformation, "Финиш"
WScript.Quit

Private Function GetTimeName(Dt)
Dim H, M
H = Hour(Dt)
If H < 10 Then H = "0" & H
M = Minute(Dt)
If M < 10 Then M = "0" & M
GetTimeName = CStr(H) & "-" & CStr(M)
End Function



by Petya V4sechkin под редакцией AndVGri, Suprus

cifrovichek
30-10-2011, 01:23
Petya V4sechkin, обращаюсь к Вам за помощью.
Ситуация подобная той, которая описана ТС.
Есть папка с большим кол-вом файлов вида:
ffaa-1.jpg
ffaa-2.jpg
ffaa-3.jpg
ggaa-1.jpg
ggaa-2.jpg
ggaa-3.jpg
Нужно чтобы скрипт создал папку "ffaa" и запихнул в неё файлы ffaa-1.jpg, ffaa-2.jpg и ffaa-3.jpg.
Аналогично со следующей группой файлов.
Это реально ?

Iska
30-10-2011, 14:32
cifrovichek, реально. Откройте командную строку и, перейдя в нужную папку, исполните следующий код:
for %i in ("E:\Песочница\0088\*.jpg") do @(set sName=%~nxi & (if not exist "!sName:~0,4!" md "!sName:~0,4!") & move "%i" "!sName:~0,4!\")
где: «E:\Песочница\0088\*.jpg» — путь и маска файлов к Вашей «папка с большим кол-вом файлов вида».

Такие вещи проще и надёжнее делать полуавтоматически при помощи файловых менеджеров.

cifrovichek
30-10-2011, 20:00
cifrovichek, реально. Откройте командную строку и, перейдя в нужную папку, исполните следующий код: »

Что -то не получается.
Пишет "неверно задано имя папки. Синтаксическая ошибка в имени файла, имени папки или метке тома"
В чём может быть проблема?

Iska
31-10-2011, 06:39
cifrovichek, надеюсь, «E:\Песочница\0088\*.jpg» Вы поменяли на своё? Все файлы «*.jpg» действительно имеют четырёхсимвольную общую часть в именах?

cifrovichek
31-10-2011, 12:28
for %i in ("E:\Песочница\0088\*.jpg") do @(set sName=%~nxi & (if not exist "!sName:~0,4!" md "!sName:~0,4!") & move "%i" "!sName:~0,4!\") »
Путь само собой поменял, символов не 4, а 7(4 приводил для примера).
Только что попробовал провести аналогичное действие, но вместо "4" в код поставил "7" - всё повторилось.

Iska
01-11-2011, 03:42
cifrovichek, в папке «E:\Песочница\0088» я создал файлы:
000ffaa-1.jpg
000ffaa-2.jpg
000ffaa-3.jpg
000ggaa-1.jpg
000ggaa-2.jpg
000ggaa-3.jpg
╔═════════════════════ E:\Песочница\0088 ╤══════╤════════╤═════╗
║и Имя │Размер│ Дата │Время║
║⌂.. │ Вверх│01.11.11│02:31║
║ 000ffaa-1 jpg│ 0│01.11.11│02:29║
║ 000ffaa-2 jpg│ 0│01.11.11│02:29║
║ 000ffaa-3 jpg│ 0│01.11.11│02:29║
║ 000ggaa-1 jpg│ 0│01.11.11│02:29║
║ 000ggaa-2 jpg│ 0│01.11.11│02:29║
║ 000ggaa-3 jpg│ 0│01.11.11│02:29║
║ │ │ │ ║

В командной строке, сделав текущим каталогом «E:\Песочница\0089», выполнил команду:
for %i in ("E:\Песочница\0088\*.jpg") do @(set sName=%~nxi & (if not exist "!sName:~0,7!" md "!sName:~0,7!") & move "%i" "!sName:~0,7!\")

Получил результат:
╔═════════════════════ E:\Песочница\0089 ╤══════╤════════╤═════╗
║и Имя │Размер│ Дата │Время║
║⌂.. │ Вверх│01.11.11│02:35║
║├000ffaa │ Папка│01.11.11│02:35║
║├000ggaa │ Папка│01.11.11│02:35║
║ │ │ │ ║

╔═════════════════ E:\Песочница\0089\000ffaa ═══╤════════╤═════╗
║и Имя │Размер│ Дата │Время║
║⌂.. │ Вверх│01.11.11│02:35║
║ 000ffaa-1 jpg│ 0│01.11.11│02:29║
║ 000ffaa-2 jpg│ 0│01.11.11│02:29║
║ 000ffaa-3 jpg│ 0│01.11.11│02:29║
║ │ │ │ ║

╔═════════════════ E:\Песочница\0089\000ggaa ═══╤════════╤═════╗
║и Имя │Размер│ Дата │Время║
║⌂.. │ Вверх│01.11.11│02:35║
║ 000ggaa-1 jpg│ 0│01.11.11│02:29║
║ 000ggaa-2 jpg│ 0│01.11.11│02:29║
║ 000ggaa-3 jpg│ 0│01.11.11│02:29║
║ │ │ │ ║

А как делали Вы?

cifrovichek
01-11-2011, 16:04
Iska, и я делаю так же. Посмотрите пожалуйста скрины, может я чего-то не замечаю?


http://s40.radikal.ru/i087/1111/a5/a8e5157c011e.jpg


http://s017.radikal.ru/i428/1111/78/d30d96c2d813.jpg


http://s008.radikal.ru/i305/1111/19/e7861714a8de.jpg

Iska
01-11-2011, 22:04
cifrovichek, научитесь, пожалуйста, снимать копию текста с содержимого окна консоли. Желания вручную набирать текст по скриншоту мало. Я понимаю, что есть моменты, когда важен именно скриншот, но в данном случае это не так.

Я проверил — у меня на Ваших файлах и путях работает, как и заявлено.

Есть предположение, что у нас с Вами разница в значении «enabledelayedexpansion» командного процессора. Я уже много лет меняю умолчальное значение…
…для текущего пользователя:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"DelayedExpansion"=dword:00000001

или в целом:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor]
"DelayedExpansion"=dword:00000001


Попробуйте запустить командный процессор с параметром «/V:ON»:
cmd.exe /v:on
а затем проделать те же манипуляции, что и ранее.

/V:ON Разрешение отложенного расширения переменных среды с применением символа '!' в качестве разделителя. Например, /V:ON разрешает использовать !var! в качестве расширения переменной var во время выполнения. Синтаксис var служит для расширения переменных при вводе, что приводит к совсем другим результатам внутри цикла FOR.

cifrovichek
02-11-2011, 02:05
Iska, спасибо большое! Теперь всё получилось!

Iska
02-11-2011, 03:47
Теперь всё получилось! »
cifrovichek, это хорошо. Значит, мне только остаётся принести Вам свои извинения — я должен был бы помнить, что мои настройки командного процессора отличаются от принятых по умолчанию.

Boomer_777
03-06-2015, 11:16
День добрый, у меня подобная проблемка, как описана выше:
Есть папка с большим кол-вом файлов вида:
ffaa-1.jpg
ffaa-2.jpg
ffaa-3.jpg
ggaa-1.jpg
ggaa-2.jpg
ggaa-3.jpg
Нужно чтобы скрипт создал папку "ffaa" и запихнул в неё файлы ffaa-1.jpg, ffaa-2.jpg и ffaa-3.jpg.
Аналогично со следующей группой файлов. »

Только вот имена файлов до разделителя "-" имеют от 1 до 6 символов, но рассортировать также надо. Скрипт выложенный выше корректно отрабатывает только на фиксированном количестве символов. Как можно сделать такую сортировку средствами windows?




© OSzone.net 2001-2012