Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Склеивание файлов в папках (желательно в bat, Но можно и ps)

Ответить
Настройки темы
Любой язык - Склеивание файлов в папках (желательно в bat, Но можно и ps)

Аватара для Тишина

Пользователь


Сообщения: 127
Благодарности: 8

Профиль | Отправить PM | Цитировать


Изменения
Автор: Тишина
Дата: 02-04-2014
ОС: 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:55, 14-11-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Тишина, если файловая система — NTFS, и длина имён файлов одинакова, то так (не проверялось):
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

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

endlocal
exit /b 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:17, 14-11-2013 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Тишина

Пользователь


Сообщения: 127
Благодарности: 8

Профиль | Отправить PM | Цитировать


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

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

ещё вопрос:
Цитата Iska:
for /d %%i in ("qqq*") do »
если я правильно понял, то цикл работает по всем папкам сразу?
это с одной стороны критично, т.к. данных будет свыше 2тб и по оценке около 1 миллиарда файлов, т.е. процесс долгий. что бы в случае фейла (память забилась, диск отвалился, тачка зависла и проч ЧП в данной ситуации) не переделывать всё занаво или возиться с миграцией/удалением выполненых папок (что вообще очень не желательно, опасаюсь ошибок MFT, т.к. слишком много файлов), хотелось бы иметь возможность выбора среди обрабатываемых папок

Последний раз редактировалось Тишина, 14-11-2013 в 13:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:36, 14-11-2013 | #3


Аватара для Тишина

Пользователь


Сообщения: 127
Благодарности: 8

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:53, 14-11-2013 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Тишина:
вот! забыл сказать, что длинна файлов не одинаковая. »
Длина имён файлов одинаковая?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:34, 14-11-2013 | #5


Аватара для Тишина

Пользователь


Сообщения: 127
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Iska:
Длина имён файлов одинаковая? »
простите, случайно пропустил по запарке...

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

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

Отправлено: 16:40, 14-11-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Цитата Тишина:
большую ясность внесу, индекс - имя файла »
То есть, имя файла — одни цифры?
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:15, 14-11-2013 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Вот как-то так:
Код: Выделить весь код
$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
    }
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:04, 14-11-2013 | #8


Аватара для Тишина

Пользователь


Сообщения: 127
Благодарности: 8

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:06, 15-11-2013 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Склеивание файлов в папках (желательно в bat, Но можно и ps)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Вывод в файл имен последних файлов в папках ivanxam Скриптовые языки администрирования Windows 2 01-10-2013 13:26
CMD/BAT - [решено] Удаление определенных файлов в конкретных папках mrG0bliN Скриптовые языки администрирования Windows 6 03-06-2013 22:37
Склеивание pdf файлов Igor32123 Хочу все знать 4 06-12-2012 19:08
CMD/BAT - [решено] "Склеивание" нескольких текстовых файлов yaoleg2 Скриптовые языки администрирования Windows 2 21-09-2011 13:52
Интерфейс - [решено] Как можно сменить рисунок, который появляется в папках с рисунками? x_tasy Microsoft Windows 2000/XP 2 31-07-2008 12:14




 
Переход