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

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

Тишина 14-11-2013 12:55 2254369

Склеивание файлов в папках (желательно в bat, Но можно и ps)
 
ОС: Win
Задача: склеить все файлы из папки в один.

Подробности:
существует большое кол-во папок, например "qqq1", "qqq1 1", "qqq1 2"... .... "qqq N", в них находятся файлы примерно с таким именем "3332.file1", "3339.file1", "3412.file1" и т.д. по возрастанию индекса в имени (прирост "рандомный").
нужен батник, который будет работать по всем папкам и склеивать (в порядке увеличения индекса) содержимое каждой в отдельный файл, т.е. из папки "qqq1 4" получится "FILE_qqq1 4.dat".

примечание: папок и файлов очень много (на данный момент около 50 миллионов файлов по 18500 в каждой папке), желательно что бы можно было указать с какой папки начать и сколько папок будет учавствовать, дабы предотвратить зависания и прочие неприятности.

P.S. эта же задача, но с решением на *NIX
http://forum.oszone.net/thread-272030.html

Iska 14-11-2013 13:17 2254380

Тишина, если файловая система — NTFS, и длина имён файлов одинакова, то так (не проверялось):
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /d %%i in ("qqq*") do (
        copy "%%~fi\*.file1" "FILE_%%~i.dat"
)

endlocal
exit /b 0


Тишина 14-11-2013 13:36 2254395

Цитата:

Цитата Iska
если файловая система — NTFS »

да, NTFS

Цитата:

Цитата Iska
и длина имён файлов одинакова »

вот! забыл сказать, что длинна файлов не одинаковая. это критично к copy?

ещё вопрос:
Цитата:

Цитата Iska
for /d %%i in ("qqq*") do »

если я правильно понял, то цикл работает по всем папкам сразу?
это с одной стороны критично, т.к. данных будет свыше 2тб и по оценке около 1 миллиарда файлов, т.е. процесс долгий. что бы в случае фейла (память забилась, диск отвалился, тачка зависла и проч ЧП в данной ситуации) не переделывать всё занаво или возиться с миграцией/удалением выполненых папок (что вообще очень не желательно, опасаюсь ошибок MFT, т.к. слишком много файлов), хотелось бы иметь возможность выбора среди обрабатываемых папок

Тишина 14-11-2013 13:53 2254405

создам тему с подобной задачей в Linux, там на сколько я знаю нужно юзать cp/dd/cat (cat вроде как самое удачное для подобной задачи)
http://forum.oszone.net/showthread.p...06#post2254406

Iska 14-11-2013 15:34 2254477

Цитата:

Цитата Тишина
вот! забыл сказать, что длинна файлов не одинаковая. »

Длина имён файлов одинаковая?

Тишина 14-11-2013 16:40 2254541

Цитата:

Цитата Iska
Длина имён файлов одинаковая? »

простите, случайно пропустил по запарке...

нет, есть все шансы что в одной из папок могут быть файлы типа qqq995 и следующий за ним qqq1003, т.е. как получится при сортировке по папкам.

большую ясность внесу, индекс - имя файла, а расшерение у них у всех одно. но, думаю, это на многое влиять не будет.

Iska 14-11-2013 18:15 2254628

Тишина, жаль. Простой и быстрый вариант с «copy *.ext result» не состоится, поскольку первым окажется «qqq1003», а не «qqq995».

Цитата:

Цитата Тишина
большую ясность внесу, индекс - имя файла »

То есть, имя файла — одни цифры?

Iska 14-11-2013 23:04 2254819

Вот как-то так:
Код:

$sRootPath = "E:\Песочница\0329"

if(Test-Path -Path $sRootPath) {
    Get-ChildItem -Path $sRootPath | Where-Object -FilterScript {
        $_.PSIsContainer
    } | ForEach-Object -Process {
        Write-Host "[$($_.FullName)]"
       
        $List = (Get-ChildItem -Path "$($_.FullName)\*.*" -Include "*.file1")

        $List | Add-Member -MemberType ScriptMethod -Name BaseName2Num -Value {$this.BaseName -replace "^.*?(\d+)$", "`$1"}
               
        $List | Sort-Object -Property BaseName2Num | `
            Get-Content -Encoding Byte -Read 4096 | `
                Set-Content -Path (Join-Path -Path "$($_.FullName)" -ChildPath "FILE_$($_.Name).dat") -Encoding Byte
    }
}


Тишина 15-11-2013 09:06 2254988

сложная конструкция... спасибо, я попробую!
в данный момент я эксперементирую с циклом и cat под Linux, как только будет положительный результат - отпишу в родственную тему.


Время: 10:26.

Время: 10:26.
© OSzone.net 2001-