Компьютерный форум 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=352950)

Yury197 02-02-2023 00:37 3002232

сортировка файлов по части имени
 
Добрый день! Есть одна задача, имеется очень большая папка на F: с файлами в именах которых в скобках указан год (1989) (пример: Иванов Иван Иванович (1978).txt). года разные. Помогите отсортировать именно в этой папке и переместить по пяти папкам (2020-2011, 2010-2001, 2000-1991, 1990-1981, 1980-1971) на C:. Спасибо.

Serguei Kouzmine 02-02-2023 02:26 3002239

опрелеленно повершелл - на батниках писать вспотеете ( про себя употребил другое слово)
- владеете повершелл ?

YuS_2 02-02-2023 05:56 3002241

Цитата:

Цитата Yury197
отсортировать именно в этой папке и переместить по пяти папкам (2020-2011, 2010-2001, 2000-1991, 1990-1981, 1980-1971) на C: »

powershell
Код:

$fldsrc = 'F:\очень большая папка'
$dskdst = 'C:\'
$flddst = '2020-2011', '2010-2001', '2000-1991', '1990-1981', '1980-1971'
$filter = '*.txt'

$fldmd = @()
for($i=0;$i -lt $flddst.count;$i++){
        $fldmd += $dskdst + $flddst[$i]
}
foreach ($item in $fldmd){
        if (!(test-path $item -patht container)){$null = md $item}
}
dir $fldsrc -file -filter $filter|%{
        if ($_.basename -match '(?<=\()(\d{4})(?=\))'){
                $d = [int]$matches[1]
                $j,$f = 0,$true
                foreach ($b in $flddst){
                        $tmp = $b -split '-'
                        if ($d -ge [int]$tmp[1] -and $d -le [int]$tmp[0]){
                                mi $_.fullname $fldmd[$j]
                                $f = $false
                                break
                        }
                        $j++
                }
                if ($f){write-host $($_.fullname) - файл не перемещён -for red}
        }
}


DJ Mogarych 02-02-2023 06:10 3002243

Powershell.
Подразумевается, что папки 1980-1971 и т. д. по пути в $to созданы.
Код:

$from = "F:\temp\from"
$to = "C:\temp\to"

$files = dir "$from" -Recurse |? psiscontainer -eq $false
foreach ($file in $files) {
    $year = [int]($file.basename -replace '.*\((\d{4})\).*','$1')
    switch ( $year )
    {
        {$year -in 1971..1980} {mv $file.FullName "$to\1980-1971" -WhatIf}
        {$year -in 1981..1990} {mv $file.FullName "$to\1990-1981" -WhatIf}
        {$year -in 1991..2000} {mv $file.FullName "$to\2000-1991" -WhatIf}
        {$year -in 2001..2010} {mv $file.FullName "$to\2010-2001" -WhatIf}
        {$year -in 2011..2020} {mv $file.FullName "$to\2020-2011" -WhatIf}
    }
    Clear-Variable year
}

Уберите -Whatif после проверки.

megaloman 02-02-2023 07:44 3002246

Цитата:

Цитата Serguei Kouzmine
на батниках писать вспотеете »

Если мерило работы не усталость, а результат, то:
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In\AllYear"
        Set "BoxOut=Z:\Box_Out"

        Call :MyMove 2020 2011
        Call :MyMove 2010 2001
        Call :MyMove 2000 1991
        Call :MyMove 1990 1981
        Call :MyMove 1980 1971
pause
Exit /B 0

:MyMove
        If not Exist "%BoxOut%\%1-%2\" Md "%BoxOut%\%1-%2\"
        For /L %%i In (%1,-1,%2) Do >nul Move "%BoxIn%\*(%%i)*.*" "%BoxOut%\%1-%2\"
Exit /B

Пути необходимо указать свои.

leopardden 07-02-2023 22:35 3002629

Приветствую.
Форум вроде живой, может кто поможет.
Ситуёвина следующая - имеется куча файлов с разной длинной имени или названия, но в конце каждого год из четырех цифр.
Как можно сделать сортировку имен файлов именно по годам ?
Сколько времени потратил на поиск и начего путного не нашел.
Заранее благодарен.

Foreigner 07-02-2023 23:59 3002636

Цитата:

Цитата leopardden
имеется куча файлов с разной длинной имени или названия, но в конце каждого год из четырех цифр »

Т.е. формат такой: <имя><год>.<расширение>?

PowerShell:

Код:

Get-ChildItem -File | Sort-Object {$_.BaseName.Substring($_.BaseName.Length - 4)}

megaloman 08-02-2023 00:18 3002638

Код:

@Echo Off
        Set "BoxIn=Z:\Box_In\abracadabra"
        Set "BoxOut=Z:\Box_Out"
        For /L %%i In (2000,1,2023) Do (
                If Exist "%BoxIn%\*%%i.*" 2>nul Md "%BoxOut%\%%i" &>nul Move "%BoxIn%\*%%i.*" "%BoxOut%\%%i\"
        )
Exit /B


leopardden 08-02-2023 01:32 3002640

Цитата:

Цитата Foreigner
Т.е. формат такой: <имя><год>.<расширение>?
PowerShell:
Код:
Get-ChildItem -File | Sort-Object {$_.BaseName.Substring($_.BaseName.Length - 4)} »


Все верно - имя + год. расширение. У имени различная длинна, но последние 4 символа всегда год.
Не кидайтесь в меня тухлыми помидорами, но с Powershell я не знаком от слова Совсем..
Скопировал отсюда туда - все красное и с ошибками. Обьясните чайнику как это сделать. :blush2:



Цитата:

Цитата megaloman
@Echo Off
Set "BoxIn=Z:\Box_In\abracadabra"
Set "BoxOut=Z:\Box_Out"
For /L %%i In (2000,1,2023) Do (
If Exist "%BoxIn%\*%%i.*" 2>nul Md "%BoxOut%\%%i" &>nul Move "%BoxIn%\*%%i.*" "%BoxOut%\%%i\"
)
Exit /B »

А с этим что делать ? Тоже Powershell ? Тут еще больше красного :dont-know

DJ Mogarych 08-02-2023 08:52 3002651

Цитата:

Цитата leopardden
с Powershell я не знаком »

Самое время начать знакомство, он уже 17 лет существует.
Цитата:

Цитата leopardden
все красное и с ошибками »

Что красное и какие ошибки - нам надо догадаться самим.
Цитата:

Цитата leopardden
А с этим что делать ? »

Это не Powershell, запускать надо в CMD.

leopardden 08-02-2023 10:55 3002655

Вложений: 1
Цитата:

Цитата DJ Mogarych
Это не Powershell, запускать надо в CMD. »

Файл 167982

leopardden 08-02-2023 10:57 3002656

Вложений: 1
Цитата:

Цитата DJ Mogarych
все красное и с ошибками »

Файл 167983

leopardden 08-02-2023 10:59 3002657

я не знаю, как выбрать конкретную папку для этих команд. Диск внешний винчестер.

DJ Mogarych 08-02-2023 11:12 3002659

Откройте Powershell ISE, вставьте туда (в белую верхнюю часть) код, который я давал здесь - http://forum.oszone.net/post-3002243-4.html

Исправьте пути
Код:

$from = "F:\temp\from"
$to = "C:\temp\to"

F:\temp\from - папка, где лежат фотографии, которые надо отсортировать
C:\temp\to - папка, где лежат ваши 5 подпапок (2020-2011, 2010-2001, 2000-1991, 1990-1981, 1980-1971).

Запустите выполнение (кнопка play или F5). Скрипт покажет, что он будет делать с фотографиями (описание), реально пока ничего происходить не будет.

Если всё выглядит нормально, уберите из кода параметры -WhatIf и запустите код ещё раз.

Foreigner 08-02-2023 11:33 3002661

Цитата:

Цитата leopardden
все красное и с ошибками » »

Как вы еще живете на 7-ке, у вас старая версия PowerShell.
Обновитесь до 5.1, 7.3.2+ уже вроде не поддерживает вин-7, у .Net Core и PowerShell Core заканчивается срок действия соглашения об обратной совместимости, уже сейчас тысячи различий, так говорят разработчики.

Для того, чтобы взять только файлы в вашем случае надо проверять, файл это или директория:

Код:

pushd "E:\Some Folder"

Get-ChildItem | Where-Object { -not $_.PSisContainer } |
    Sort-Object {$_.BaseName.Substring($_.BaseName.Length - 4)}

popd

Мне не ясная конечная цель сортировки, эти файлы надо просто просмотреть по порядку, скопировать или переместить куда-то?

leopardden 08-02-2023 12:36 3002668

Цитата:

Цитата Foreigner
Обновитесь до 5.1, 7.3.2+ »

не могу обновить, не работает. Хоть и Framework обновлен. Короче ничего не получится.
Всем спасибо за ответы, зря отнял ваше время. Придется или смириться или искать какой то другой способ.
Я остаюсь на Вин 7 т.к. считаю ее лучшей ИМХО

DJ Mogarych 08-02-2023 13:34 3002678

Цитата:

Цитата leopardden
Придется или смириться или искать какой то другой способ »

Я вам расписал решение, в чём проблема?

megaloman 08-02-2023 15:29 3002697

Вложений: 1
Цитата:

Цитата leopardden
Придется или смириться или искать какой то другой способ »

Я вам тоже расписал решение, в чём проблема - матчасть выучить?
Мой код надо сохранить в файл с расширением .bat и затем его запускать на выполнение.
Прилагаю к сообщению, только уберите расширение .txt, чтобы осталось .bat
Код:

        Set "BoxIn=Z:\Box_In\abracadabra"
        Set "BoxOut=Z:\Box_Out"

Здесь пропишите Ваши пути к папкам, где находятся исходные файлы и куда помещаются папки по годам, я не в курсе, где имеется куча файлов .

leopardden 08-02-2023 15:57 3002703

Цитата:

Цитата DJ Mogarych
Я вам расписал решение, в чём проблема? »

проблема в том, что у меня абсолютно нет времени во всем этом разбираться. Мне нужно что-то простое и быстрое.
И кстати нашел, может кому пригодится - all my movies и еще MediaMonkey.
В обеих программах есть возможность сортировки по годам. Только что обе они платные, надо или ключи или кряки искать.
В общем, всем спасибо, вопрос закрыт :victory:

leopardden 08-02-2023 17:42 3002711

Цитата:

Цитата megaloman
в чём проблема - матчасть выучить? »

у меня нет на это времени. Дом, семья, работа и т.д

Цитата:

Цитата megaloman
где находятся исходные файлы и куда помещаются папки по годам »

я не говорил, что их надо перемещать куда-то, это надо было другому человеку. Мне же просто надо было сортировку по годам.

DJ Mogarych 08-02-2023 19:43 3002717

Потратить 5 минут на скрипт времени нет, зато программы искать с кряками и разбираться с их настройкой - есть.
Ну, удачи.

Yury197 12-02-2023 23:00 3003018

Get-ChildItem -File | Sort-Object {$_.BaseName.Substring($_.BaseName.Length - 4)}
1. скрипт шмонать весь комп будет или как-то папку можно обозначить?
2. а год может быть не последние 4 знака в имени.Например: пробел год пробел, без пробелов
(чистые 4 знака), а также в скобках (1974). неуж-то интеллект искусственный и вправду заработал?

Foreigner 12-02-2023 23:16 3003021

Yury197,
Цитата:

Цитата Yury197
1. скрипт шмонать весь комп будет или как-то папку можно обозначить? »

Нет, только текущую директорию

Цитата:

Цитата Yury197
2. а год может быть не последние 4 знака в имени.Например: пробел год пробел, без пробелов
(чистые 4 знака), а также в скобках (1974).»

Приведите различные варианты.

YuS_2 13-02-2023 08:51 3003028

Цитата:

Цитата Yury197
а год может быть не последние 4 знака в имени.Например: пробел год пробел, без пробелов
(чистые 4 знака), а также в скобках (1974). »

Цитата:

Цитата Yury197
Есть одна задача, имеется очень большая папка на F: с файлами в именах которых в скобках указан год (1989) »

Это несколько различные постановки задачи... необходимо чуть более ответственно подходить к составлению условий изначально...
Сконцентрируйтесь и выдайте все абсолютно условия и сразу, если, конечно, есть желание получить полное решение.


Время: 14:59.

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