как с помощью xcopy скопировать несколько папок?

woofster

сейчас нет нормального интернета под рукой. скажите, а как из командной строки скопировать несколько папок одновременно, вместе с их содержимым?

Serab

по одной нельзя?

woofster

их у меня 2500

Serab

ну это не «несколько», конечно :grin:
туманно ты пишешь. А что, там 2500, которые надо скопировать и еще тыща, которые не надо что ли? И все в одной общей папке, так?

woofster

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

Dimon89

Ключи /s /e /i. Можно ещё /exclude если требуемые папки не описываются шаблоном.
UPD: если у тебя Vista или старше, используй Robocopy

danaql

напишу подробнее: у меня есть задача сгруппировать эти 2500 папок по разным папкам, есть список какие папки куда запихнуть. чтобы вручную не ебаться я хочу сделать это через командную строку
Я такие вещи делаю через Excel, когда есть колонки с параметрами, в отдельной колонке объединяю строки, чтобы получилась команда и сохраняю как текстовый файл, который потом запускаю.
Команда xcpoy [Источник] [объект] /E /C /H /Y
/E Копирование каталогов с подкаталогами, включая пустые.
/C Продолжение копирования вне зависимости от наличия ошибок.
/H Копирование, среди прочих, скрытых и системных файлов.
 /Y Подавление запроса подтверждения на перезапись существующего целевого файла.
Таким способом через Excel->bat создавал структуру папок в предприятии, создание групп в AD, назначение прав на папки для групп и добавление пользователей в эти группы по заданным разрешениям.

woofster

дк это всё понятно. а как правильно указать список файлов в одной строке?

oliver11

А зачем? Скопируй каждый отдельным запуском xcopy.

danaql

В экселе создаешь столбец "Что копировать", столбец "Куда копировать", дальше в третьем столбце функцией СЦЕПИТЬ формируешь строку для запуска.
Если у тебя 2500 объектов, то будет 2500 строчек в этом столбце. Дальше сохраняешь этот столбец как bat файл и запускаешь.

sergey_m

Копировать несколько папок! Через Excel!
омг, я сохраню этот тред.

danaql

Копировать несколько папок! Через Excel!
омг, я сохраню этот тред.
Удобный инструмент, быстрее чем писать что-то, что будет читать данные из нескольких файлов и по результатам выполнять команду.
А как бы ты решал задачу, когда у тебя есть список 2500 файлов/папок и куда их копировать вроде:
Из C:\Папка1\38816221 скопировать в D:\Папка2\56100344
Из C:\Папка1\73633804 скопировать в D:\Папка2\82273341
Из C:\Папка1\75580167 скопировать в D:\Папка2\61650725
Из C:\Папка1\37095399 скопировать в D:\Папка2\18017430
Из C:\Папка1\55599318 скопировать в D:\Папка2\43901138
.....

sergey_m

А что такое C:\ и D:\?

Troyn09

толсто

danaql

А что такое C:\ и D:\?
Кроме винды где-то еще есть xcopy ;) ?

hiper-hoper

alias xcopy='cp'

danaql

alias xcopy='cp'
Поизвращаться можно по-разному.
Тут пользователь задал вопрос, из которого понятно что задача под винду.
Было предложено быстрое и эффективное решение задачи, пусть и не самое красивое. Если можно сделать быстрее и эффективнее, то мне было бы интересно узнать как.
То что все тут умные и хитровыделанные и так понятно, без кучи постов "посмотрите какой я оригинальный".

hiper-hoper

ну до тех пор, пока эксель не поставляется как часть винды твое решение не лучше, чем захуячить в цигвине/мингв скрипт на питоне каком-нибудь.

danaql

Предложи лучше вариант, который позволит достигнуть цели быстрее.
То что у топикстартера есть Excel я уверен на 99%
Большей ошибкой было бы считать что человек, который не запускает "xcopy /?" станет прогать.

apl13

Если можно сделать быстрее и эффективнее, то мне было бы интересно узнать как.
1. Ставишь MSYS (ну или Cygwin, tastes differ).
2. Запусаешь bash.
3. Набираешь
awk '{"cp -R " $2 " " $5}' list.txt

где вместо list.txt нужно подставить имя файла с твоим мегасписком.
И нажимаешь <Enter>.

apl13

Ну или xcopy вместо cp, если принципиально ею.

danaql

Интересное решение. Открыл для себя Cygwin :)
С русскими кодировками проблем не будет при копировании?

viktor954


@echo off
for /f "tokens=1,2 delims=," %%a in (files.csv) do (
xcopy "%%~a" "%%~b"
)

files.csv:

filename1,path1
filename2,path2

danaql

files.csv:
Как файл формируется?

danaql

С русскими кодировками проблем не будет при копировании?
Немного уточню вопрос. Вообще с кодировками. И с длинной пути.
Периодически сталкивался с ситуациями, когда какой-нибудь TotalCommander не обрабатывает очень длинные пути или файлы, названные иероглифами, а проводник Windows с ними работает нормально.

viktor954

?!
также, как тут:
или даже тут:

danaql

?!
В примере с "awk '{"cp -R " $2 " " $5}' list.txt" я так понял что берутся значения из второго и пятого столбца. Команда считает что столбцы разделены пробелами. Как в примере. Или я не так понял?
Для того чтобы из такого файла сформировать csv, в котором значения разделяются запятыми и очищены от мусора необходимо приложить некоторые усилия. В том же Excel это делается в одно действие "Разбить текст по столбцам" считая за разделитель пробел и дальше сохранить в csv. Ты, насколько я понял, хочешь обойтись штатными средствами OS.

viktor954

Ок, исправляю под такой вариант исходных данных:

@echo off
for /f "tokens=1-5 " %%a in (list.txt) do (
xcopy "%%~b" "%%~e"
)

danaql

Здорово :)
Открыл для себя еще одну новую вещь. Попробую использовать для обработки логов телефонии.
Радуют адекватные и полезные ответы, когда вместо "я такой умный, спрошу ка что такое C:\" человек берет и пишет красивое решение.

viktor954

обработки логов телефонии
тогда всё-таки лучше sed, awk и grep
P.S. Я предпочитаю GnuWin CygWin-у

Filan

В примере с "awk '{"cp -R " $2 " " $5}' list.txt" я так понял что берутся значения из второго и пятого столбца. Команда считает что столбцы разделены пробелами. Как в примере. Или я не так понял?
Любая последовательность white-символов (например пробел, табуляция).
 
Для того чтобы из такого файла сформировать csv, в котором значения разделяются запятыми и очищены от мусора необходимо приложить некоторые усилия.

Пример?
Другой разделитель - есть ключик -F.

tucha96

1. Ставишь MSYS (ну или Cygwin, tastes differ).
Ну вообще скорее всего эта операция делается один раз, так что любые средства, которые есть, подходят ок. И эксель - норм решение или что еще под рукой есть.

elenangel

+ к gnuwin, ставил coreutils оттуда на 2003 сервер, жизнь становилась веселее.
все эти grep, awk, sed, wc, ls на самом деле вызывают зависимость, без них потом как без рук. и еще for башевый.

evgen5555

docs.google.com
цигвин не нужен

sergey_m

Тут просто решений (кроме Excel) тысяча, и многие из них неидеальны, особенно самые лаконичные. Я опасался, что запостив один вариант, сразу получу в ответ гнобёжку. Но тут вроде люди постят и гнобёжки нет, так что мой вариант, без всяки awk/sed и прочих дополнительных процессов:
while read a b; do cp $a $b; done < list.txt
Тут проблема будет с пробелами в именах, их предварительно надо в списке заескейпить.

danaql

пробелами в именах
Очень верно подмечено! Варианты, предложенные выше, не обработают такие ситуации.
Если рассматривать более общий случай, то в именах файлов/папок могут встречаться не только пробелы, но и другие "разделители" вроде "скопировать", "Из" и пр. Тогда нужно находить начало пути "X:\" и отрезать перед этими символами строку определенной длинны.

sergey_m

Я поэтому сразу и спросил: что за хуйня X:\? В нормальных ОС ограничения на символы из которых может состоять имя файла очень лаконичны, поэтому легко их обрабатывать. Что в винде с ограничениями мне не понятно. Может ли имя файла содержать двоеточие?

Marinavo_0507

В нормальных ОС ограничения на символы из которых может состоять имя файла очень лаконичны, поэтому легко их обрабатывать.
UTF8 несколько портит дело только

danaql

Что в винде с ограничениями мне не понятно. Может ли имя файла содержать двоеточие?
В винде имя файла/папки не может содержать символов \ / : * ? < > |

yroslavasako

Может ли имя файла содержать двоеточие?
двоеточие - это знак обращения к ntfs потоку. внутри файла может быть древообразная структура потоков. Вот для них двоеточие и и юзается

apl13

Очень верно подмечено! Варианты, предложенные выше, не обработают такие ситуации.
awk -F 'Из | скопировать в ' '{"cp \"" $2 "\" \"" $3"\""}' list.txt

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

danaql

А если будет файл "С:\Папка1\Из какой папки скопировать в какую\1.txt" то уже будет сбой.

apl13

Кавычками надо пользоваться тогда.

danaql

Кавычками надо пользоваться тогда.
Не всегда исходные данные предоставляют в таком виде, как мы хотим.
Кто-то присылает картинки в вордовском документе и просит выложить их на сайт, кто-то кавычки не ставит :)
Можно допиливать скрпит, чтобы он выбирал только нужные данные, хотя, на мой взгляд, вопрос уже обсудили со всех сторон.

hiper-hoper

docs.google.com
им уже можно пользоваться без передачи всей своей инфы большому брату?

apl13

Из скопировать в скопировать в скопировать в скопировать в

Скрипт сломается, когда в текущем каталоге будут каталоги "скопировать в" и "скопировать в скопировать в".
Любой скрипт сломается.
Человек-оператор тоже ничего не поймет.

danaql

В Excel делается просто - разбиваем столбец с данными (в ячейке вся строка из текстового файла) на 3, используя разделитель ":".
Берем из первого столбца последний символ, от второго отрезаем N символов с конца и получаем путь "Откуда"
Для получения пути "Куда" берем последний символ из второго столбца и объединяем с 3м.

apl13

Если есть такой разделитель.
Ты заметил, что у меня относительные пути?

Filan

используя разделитель ":"
Так какой же разделитель ":" или?
Давай сразу пример как выглядит строка, из которой нужно получить имена файлов.

danaql

Честно говоря про относительные пути не очень понял.
Если мы обсуждаем работу скрипта/обработки на примере из моего поста
Из C:\Папка1\38816221 скопировать в D:\Папка2\56100344

то там всегда будут двоеточия после буквы диска.
Пример:
Из C:\Папка1\Скопировать в скопировать в Из\123 скопировать в D:\Папка2\Скопировать в скопировать Из в 1\321
Если будут относительные пути, напрмер
Из Скопировать в скопировать в скопировать в скопировать в скопировать в
то тут обработать действительно не получится. можно понять как
Из Скопировать в скопировать в скопировать в скопировать в скопировать в
так и
Из Скопировать в скопировать в скопировать в скопировать в скопировать в
Тут уже нужно обрабатывать как нештатную ситуацию и составлять список данных, которые скопировать невозможно.
В Excel такая проверка и выборка делается элементарно с помощью фильтров - то что не удалось разбить по двоеточиям или разбить по "скопировать в" (получилось больше 3 столбцов).

apl13

sed 's/^Из \(.*\) скопировать в \(.:.*\)/cp -R "\1" "\2"/' | awk '{system($0)}'

danaql

Поясни, пожалуйста, что тут что обозначает. Здесь мне уже догадаться сложно ^.^

evgen5555

Можно.

Filan

Эээ. Почитай про регекспы.
Оставить комментарий
Имя или ник:
Комментарий: