PDA

Показать полную графическую версию : Сортировка файлов по имени.


Extazik
23-09-2015, 09:45
Здравствуйте. Прошу помощи в написании программы для сортировки файлов.
Ситуация такая. Есть папка с подпапками в которых сотри картинок скаченных с deviantart. Файлы имею имя вот такого типа "zzzz_zzz_by_xxxxx-d5dw6o7" "zzzz_zzz" - вместо этого может быть любой набор слов. После "by" идет автор картинки "xxxxx". Надо что бы программа рассортировала картинки по ее автору. Все картинки определенного автора в определенную папку.

Iska
23-09-2015, 09:56
сотри »
«сотни»?

Упакуйте для примера по две-три картинки двух-трёх авторов в архив, выложите его на RGhost, ссылку — сюда.

corbis
23-09-2015, 11:58
dir $path *.jpg -Recurse | foreach {New-Item -ItemType directory -Path ("F:\test\" + (((($_.Name -split "_by_")[1]) -split "-")[0])) -ErrorAction SilentlyContinue;
Copy-Item $_.FullName -Destination ($path + "\" + (((($_.Name -split "_by_")[1]) -split "-")[0]) + "\") -ErrorAction SilentlyContinue
}

Foreigner
23-09-2015, 17:35
corbis, А если в имени автора есть '_by_' и/или '-' ?

corbis
23-09-2015, 18:01
ну, автор дал шаблон, я по шаблону и сделал. Будут другие условия - будет другое решение.
И вообще, я не настаиваю на использовании, просто предложил вариант.

Iska
23-09-2015, 18:16
Сейчас автор нам подскажет.

Foreigner
23-09-2015, 18:26
Мой вариант, но наверное тоже можно придраться:

$groups = get-childitem 'D:\test' | group { ($_ -split '^.+_by_|-[^-]+$')[1] }
foreach ($group in $groups) {

$null = new-item -itemtype dir "D:\test\$($group.name)"
$group.group | foreach { move-item $_.fullname "D:\test\$($group.name)" }

}

Extazik
23-09-2015, 18:31
Iska, Ну вот для примера я несколько картинок упаковал http://rghost.ru/6DQkn5FfY.
Foreigner, Авторов у которых в имени есть "_by_" я еще не встречал, хотя наверное есть такие. Вот авторов у которых есть "-","_" я встречал.

Мой вариант, но наверное тоже можно придраться »
Ваш вариант у меня заработал, спасибо, очень круто :)
Есть только одна маленькая проблемка. Файлы в под папках программа почему то не видит. Можно это исправить?

Foreigner
23-09-2015, 19:03
Файлы в под папках программа почему то не видит. Можно это исправить? »
Добавить -recurse к get-childitem:

$groups = get-childitem 'D:\test' -recurse | ...


Но проблема с вхождениями _by_ не решена, так что результат может быть неожиданным..

Extazik
23-09-2015, 19:15
Но проблема с вхождениями _by_ не решена, так что результат может быть неожиданным.. »
Картинки у которых в имени два и более _by_ просто игнорируются, это не страшно, т.к я еще не встречал такие файлы, пока что :)

А можно еще добавить возможность удалять пустые папки?

Foreigner
23-09-2015, 19:47
Extazik, В смысле пустые? Те которые остались без файлов?

$dir = 'D:\test'
$groups = get-childitem $dir -file -recurse | group { ($_ -split '^.+_by_|-[^-]+$')[1] }
foreach ($group in $groups) {

$null = new-item -itemtype dir "$dir\$($group.name)"
$group.group | foreach { move-item $_.fullname "$dir\$($group.name)" }

}

get-childitem $dir -dir -recurse |

where { !(test-path "$($_.fullname)\*") } |
foreach { remove-item $_.fullname }

Iska
23-09-2015, 20:28
Но проблема с вхождениями _by_ не решена, так что результат может быть неожиданным.. »
Ну, так делите только по первому разделителю, а остаток имени до последнего «-» берите целиком. Детали реализации целиком на Ваше усмотрение — я в PoSH ещё тот специалист.

Extazik
24-09-2015, 23:26
Extazik, В смысле пустые? Те которые остались без файлов? »
Они самые.

Не хотят удаляться почему то




© OSzone.net 2001-2012