Показать полную графическую версию : Склеивание файлов в папках (желательно в 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
Тишина, если файловая система — NTFS, и длина имён файлов одинакова, то так (не проверялось):
@echo off
setlocal enableextensions enabledelayedexpansion
for /d %%i in ("qqq*") do (
copy "%%~fi\*.file1" "FILE_%%~i.dat"
)
endlocal
exit /b 0
если файловая система — NTFS »
да, NTFS
и длина имён файлов одинакова »
вот! забыл сказать, что длинна файлов не одинаковая. это критично к copy?
ещё вопрос:
for /d %%i in ("qqq*") do »
если я правильно понял, то цикл работает по всем папкам сразу?
это с одной стороны критично, т.к. данных будет свыше 2тб и по оценке около 1 миллиарда файлов, т.е. процесс долгий. что бы в случае фейла (память забилась, диск отвалился, тачка зависла и проч ЧП в данной ситуации) не переделывать всё занаво или возиться с миграцией/удалением выполненых папок (что вообще очень не желательно, опасаюсь ошибок MFT, т.к. слишком много файлов), хотелось бы иметь возможность выбора среди обрабатываемых папок
создам тему с подобной задачей в Linux, там на сколько я знаю нужно юзать cp/dd/cat (cat вроде как самое удачное для подобной задачи)
http://forum.oszone.net/showthread.php?p=2254406#post2254406
вот! забыл сказать, что длинна файлов не одинаковая. »
Длина имён файлов одинаковая?
Длина имён файлов одинаковая? »
простите, случайно пропустил по запарке...
нет, есть все шансы что в одной из папок могут быть файлы типа qqq995 и следующий за ним qqq1003, т.е. как получится при сортировке по папкам.
большую ясность внесу, индекс - имя файла, а расшерение у них у всех одно. но, думаю, это на многое влиять не будет.
Тишина, жаль. Простой и быстрый вариант с «copy *.ext result» не состоится, поскольку первым окажется «qqq1003», а не «qqq995».
большую ясность внесу, индекс - имя файла »
То есть, имя файла — одни цифры?
Вот как-то так:
$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
}
}
сложная конструкция... спасибо, я попробую!
в данный момент я эксперементирую с циклом и cat под Linux, как только будет положительный результат - отпишу в родственную тему.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.