Показать полную графическую версию : Сортировка файлов по имени.
Здравствуйте. Прошу помощи в написании программы для сортировки файлов.
Ситуация такая. Есть папка с подпапками в которых сотри картинок скаченных с deviantart. Файлы имею имя вот такого типа "zzzz_zzz_by_xxxxx-d5dw6o7" "zzzz_zzz" - вместо этого может быть любой набор слов. После "by" идет автор картинки "xxxxx". Надо что бы программа рассортировала картинки по ее автору. Все картинки определенного автора в определенную папку.
сотри »
«сотни»?
Упакуйте для примера по две-три картинки двух-трёх авторов в архив, выложите его на RGhost, ссылку — сюда.
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_' и/или '-' ?
ну, автор дал шаблон, я по шаблону и сделал. Будут другие условия - будет другое решение.
И вообще, я не настаиваю на использовании, просто предложил вариант.
Сейчас автор нам подскажет.
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)" }
}
Iska, Ну вот для примера я несколько картинок упаковал http://rghost.ru/6DQkn5FfY.
Foreigner, Авторов у которых в имени есть "_by_" я еще не встречал, хотя наверное есть такие. Вот авторов у которых есть "-","_" я встречал.
Мой вариант, но наверное тоже можно придраться »
Ваш вариант у меня заработал, спасибо, очень круто :)
Есть только одна маленькая проблемка. Файлы в под папках программа почему то не видит. Можно это исправить?
Foreigner
23-09-2015, 19:03
Файлы в под папках программа почему то не видит. Можно это исправить? »
Добавить -recurse к get-childitem:
$groups = get-childitem 'D:\test' -recurse | ...
Но проблема с вхождениями _by_ не решена, так что результат может быть неожиданным..
Но проблема с вхождениями _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 }
Но проблема с вхождениями _by_ не решена, так что результат может быть неожиданным.. »
Ну, так делите только по первому разделителю, а остаток имени до последнего «-» берите целиком. Детали реализации целиком на Ваше усмотрение — я в PoSH ещё тот специалист.
Extazik, В смысле пустые? Те которые остались без файлов? »
Они самые.
Не хотят удаляться почему то
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2024, Jelsoft Enterprises Ltd.