--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

Копирование файлов по списку

7104
28
С друзьями на NN.RU
В социальных сетях
Поделиться
Andy Tukker
21.04.2008
Есть каталог с множеством файлов, разложенных в разные подкаталоги. Структура не известна, как и количество файлов. Есть некий файл со списком нужных файлов. Требуется создать копию каталога, но только с "нужными" файлами, входящими в список. Как это можно сделать? Файл со списком создается программно, формат можно менять в очень широких пределах.
СычЪ
21.04.2008
В этом "некоем файле" только названия или названия с путями?
Полностью относительный путь внутри каталога, например, вот такой: Alt luci\AMARCORD PA1505.jpg . При необходимости можно разделить, отдельно имена вложенных каталогов, отдельно имя самого файла.
СычЪ
21.04.2008
Если предполагается делать бэкап, можно воспользоваться winrar-ом, он вроде бы умеет обрабатывать файло по списку, из текстового файла.
Не совсем бэкап, но вариант с архивом интересный...
Кстати, вопрос! Можно ли выложить по фтп на сервер архив и там его распаковать?
СычЪ
21.04.2008
Заданием можно.
ОС Винда, я так предполагаю?
Да! Если это имеет значение, то сейчас на большинстве компов, где будет происходить копирование, установлена XP, но постепенно идет переход на Vista.
и процесс нужно полностью автоматизировать?

вручную можно сделать с помощью FAR-менеджера. У него есть "временная панель", которая понимает файлы списков. Только список должен содержать абсолютные пути, которые, в общем-то, несложно из исходного файла переделать.
После этого ENter по такому файлу приведет к открытию всего списка на одной панели и останется только нажать F5.
Хотя не совсем то получится. Если в условии "создать такой же каталог" подразумевает полную структуру поддиректорий, то проще будет сделать полную копию, потом инвертированный поиск и удалить всё найденное
"Полностью автоматизировать", в данном случае означет избавиться от ручного поиска и копирования каждого файла. Некоторое количество ручных действий вполне допустимо, но оно не должно зависеть от количества файлов.
При копировании необходимо сохранить структуру, посколько есть не нулевая вероятность совпадения имен файлов в разных подкаталогах.
Вариант сделать полную копию, а потом лишнее удалить тоже вполне возможен, но и его хотелось бы избавить от множества ручных операций.
В список файлов можно писать абсолютные пути, это не вызывает каких-либо сложностей.
Список файлов большой?
Если не очень, то подойдет программа robocopy
команда будет выглядеть так:
robocopy c:\temp d:\temp file1 file2 file3 /s
c:\temp - исходный каталог
d:\temp - каталог назначения
Не пойдет, в списке будет несколько тысяч файлов, вполне возможно, что 10...15 000.
Saul
21.04.2008
у robocopy есть поддержка job-файлов, они текстовые по своей сути и легко могут генериться другими программами
robocopy - freeware?
Saul
21.04.2008
Да, входит в состав Windows NT Resource Kit
Stinky
21.04.2008
Как вариант, батник вида
@echo off

set sourcedir=c:\откуда копируем
set destdir=c:\куда будем\копировать

for /F "eol=; tokens=1* delims=|" %%i in (файл-список.txt) do (
echo F | xcopy "%sourcedir%\%%i" "%destdir%\%%i" /y /q /f
)


Если формат файла со списком действительно можно менять в широких пределах, то наверное можно сразу генерить его с вышеобозначенной строкой с xcopy и запускать как батник.
В файл можно дописать и какие-то команды, но как он в таком случае будет ссылаться сам на себя? Может быть, генерить файл со списком и батник со ссылкой на этот список?
Будет ли работать xcopy с файлами, содержащими пробелы в именах?
Stinky
21.04.2008
Andy Tukker писал(а)
Может быть, генерить файл со списком и батник со ссылкой на этот список?
Я вот этого не совсем понял. Пример выше вроде вроде как раз так и работает - есть батник, есть файл со списком, есть исходный и конечный каталоги.
Если список тоже нужно копировать, дык, сам себя батник скопировать вполне в состоянии. ...кажется... :)
xcopy, как и прочие, адекватно воспринимает имена с пробелами, если их засунуть в кавычки. Собсно, выше так и сделано.

ЗЫ: Так маленько правильнее:
@echo off

set sourcedir=c:\откуда копируем
set destdir=c:\куда будем\копировать

for /F "tokens=1*" %%i in (файл-список.txt) do (
echo F | xcopy "%sourcedir%\%%i" "%destdir%\%%i" /y /q /f
)
Был неправ, всё хорошо, огромное спасибо, ушел пробовать! :-)
что произойдет, если в списке встретится не существующий файл? Батник его пропустит и пойдет дальше или выдаст ошибку и остановится?
Список файлов может выглядеть, например, вот так: ---->
К сообщению прикреплен файл:
8764933-pict.txt   (4 Kb)   Скачать файл
Сделал батник:

@echo off

set sourcedir=
set destdir=d:\5

for /F "tokens=1*" %%i in (pict.txt) do (
echo F | xcopy "%sourcedir%\%%i" "%destdir%\%%i" /y /q /f
)

положил его в тот же каталог, где лежит pict.txt, запустил. Он про каждый файл обругался, что нет такого файла :-/ Но написал, что "нет файла Alt", т.е. он не воспринимает пробелы в имени каталога. В каком месте поставить кавычки? Или это решается как-то иначе?
Stinky
21.04.2008
Проверка на "program files\internet explorer" показывает что с пробелами вроде как усе в порядке. Но в таком виде получается, что xcopy запускается с параметрами
xcopy "\D:\Bases\хгнапюфемхъ\LOGO\Alt luce.jpg" "d:\5\D:\Bases\хгнапюфемхъ\LOGO\Alt luce.jpg"
Это вообще достаточно проблематично выполнить. :)
В оригинале, было про "относительный путь внутри каталога", в образце путь абсолютный. Собсно, никто не предусматривал :)

И в догонку... Намудрил я с более правильным вариантом. Первый for как-то лучше работал :-D

Собственно, вот эти батник со списком отработали как (наверное) задумано.
К сообщению прикреплен файл:
8765480-123.bat   (1 Kb)   Скачать файл
К сообщению прикреплен файл:
8765480-list.txt   (1 Kb)   Скачать файл
Неправильные имена файлов отображаются только в браузере, всамом файле всё хорошо :-) Браузер по умолчанию предполагает кодировку КОИ8, а там win.
Пути сейчас верну относительные, что-то я действительно увлекся и смешал все советы из этой темы в один :-)
Спасибо огромное, процесс пошел!
К сожалению, как выяснилось, русские имена файлов/каталог не воспринимаются, но это уже мелочи...
Stinky
21.04.2008
Русские имена для консольных прог (собственно батников, xcopy и т.п.) воспринимаются в cp866, а создаются в этой самой windows-1251. Хотя работать вроде и так должно. Наверное... Не пробовал... ;)
[ViKING]
21.04.2008
К FAR'у есть плагин выделения группы файлов по списку
никаких путей не надо, просто список с именами файлов.
По моему проще некуда.
Необходимо сохранить структуру, там не просто много файлов, а еще и подкаталоги.
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов