Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сортировка файлов по имени. (http://forum.oszone.net/showthread.php?t=305789)

Extazik 23-09-2015 09:45 2556561

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

Iska 23-09-2015 09:56 2556564

Цитата:

Цитата Extazik
сотри »

«сотни»?

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

corbis 23-09-2015 11:58 2556625

Код:

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 2556771

corbis, А если в имени автора есть '_by_' и/или '-' ?

corbis 23-09-2015 18:01 2556776

ну, автор дал шаблон, я по шаблону и сделал. Будут другие условия - будет другое решение.
И вообще, я не настаиваю на использовании, просто предложил вариант.

Iska 23-09-2015 18:16 2556783

Сейчас автор нам подскажет.

Foreigner 23-09-2015 18:26 2556789

Мой вариант, но наверное тоже можно придраться:
Код:

$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 2556791

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

Цитата:

Цитата Foreigner
Мой вариант, но наверное тоже можно придраться »

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

Foreigner 23-09-2015 19:03 2556804

Цитата:

Цитата Extazik
Файлы в под папках программа почему то не видит. Можно это исправить? »

Добавить -recurse к get-childitem:
Код:

$groups = get-childitem 'D:\test' -recurse | ...
Но проблема с вхождениями _by_ не решена, так что результат может быть неожиданным..

Extazik 23-09-2015 19:15 2556811

Цитата:

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

Картинки у которых в имени два и более _by_ просто игнорируются, это не страшно, т.к я еще не встречал такие файлы, пока что :)

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

Foreigner 23-09-2015 19:47 2556822

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 2556827

Цитата:

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

Ну, так делите только по первому разделителю, а остаток имени до последнего «-» берите целиком. Детали реализации целиком на Ваше усмотрение — я в PoSH ещё тот специалист.

Extazik 24-09-2015 23:26 2557369

Цитата:

Цитата Foreigner
Extazik, В смысле пустые? Те которые остались без файлов? »

Они самые.

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


Время: 14:52.

Время: 14:52.
© OSzone.net 2001-