как с помощью xcopy скопировать несколько папок?
по одной нельзя?
их у меня 2500
туманно ты пишешь. А что, там 2500, которые надо скопировать и еще тыща, которые не надо что ли? И все в одной общей папке, так?
напишу подробнее: у меня есть задача сгруппировать эти 2500 папок по разным папкам, есть список какие папки куда запихнуть. чтобы вручную не ебаться я хочу сделать это через командную строку
UPD: если у тебя Vista или старше, используй Robocopy
напишу подробнее: у меня есть задача сгруппировать эти 2500 папок по разным папкам, есть список какие папки куда запихнуть. чтобы вручную не ебаться я хочу сделать это через командную строкуЯ такие вещи делаю через Excel, когда есть колонки с параметрами, в отдельной колонке объединяю строки, чтобы получилась команда и сохраняю как текстовый файл, который потом запускаю.
Команда xcpoy [Источник] [объект] /E /C /H /Y
/E Копирование каталогов с подкаталогами, включая пустые.
/C Продолжение копирования вне зависимости от наличия ошибок.
/H Копирование, среди прочих, скрытых и системных файлов.
/Y Подавление запроса подтверждения на перезапись существующего целевого файла.
Таким способом через Excel->bat создавал структуру папок в предприятии, создание групп в AD, назначение прав на папки для групп и добавление пользователей в эти группы по заданным разрешениям.
дк это всё понятно. а как правильно указать список файлов в одной строке?
А зачем? Скопируй каждый отдельным запуском xcopy.
Если у тебя 2500 объектов, то будет 2500 строчек в этом столбце. Дальше сохраняешь этот столбец как bat файл и запускаешь.
омг, я сохраню этот тред.
Копировать несколько папок! Через 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
.....
А что такое C:\ и D:\?
толсто
А что такое C:\ и D:\?Кроме винды где-то еще есть xcopy ?
alias xcopy='cp'
alias xcopy='cp'Поизвращаться можно по-разному.
Тут пользователь задал вопрос, из которого понятно что задача под винду.
Было предложено быстрое и эффективное решение задачи, пусть и не самое красивое. Если можно сделать быстрее и эффективнее, то мне было бы интересно узнать как.
То что все тут умные и хитровыделанные и так понятно, без кучи постов "посмотрите какой я оригинальный".
ну до тех пор, пока эксель не поставляется как часть винды твое решение не лучше, чем захуячить в цигвине/мингв скрипт на питоне каком-нибудь.
То что у топикстартера есть Excel я уверен на 99%
Большей ошибкой было бы считать что человек, который не запускает "xcopy /?" станет прогать.
Если можно сделать быстрее и эффективнее, то мне было бы интересно узнать как.1. Ставишь MSYS (ну или Cygwin, tastes differ).
2. Запусаешь bash.
3. Набираешь
awk '{"cp -R " $2 " " $5}' list.txt
где вместо list.txt нужно подставить имя файла с твоим мегасписком.
И нажимаешь <Enter>.
Ну или xcopy вместо cp, если принципиально ею.
С русскими кодировками проблем не будет при копировании?
@echo off
for /f "tokens=1,2 delims=," %%a in (files.csv) do (
xcopy "%%~a" "%%~b"
)
files.csv:
filename1,path1
filename2,path2
files.csv:Как файл формируется?
С русскими кодировками проблем не будет при копировании?Немного уточню вопрос. Вообще с кодировками. И с длинной пути.
Периодически сталкивался с ситуациями, когда какой-нибудь TotalCommander не обрабатывает очень длинные пути или файлы, названные иероглифами, а проводник Windows с ними работает нормально.
также, как тут:
или даже тут:
?!В примере с "awk '{"cp -R " $2 " " $5}' list.txt" я так понял что берутся значения из второго и пятого столбца. Команда считает что столбцы разделены пробелами. Как в примере. Или я не так понял?
Для того чтобы из такого файла сформировать csv, в котором значения разделяются запятыми и очищены от мусора необходимо приложить некоторые усилия. В том же Excel это делается в одно действие "Разбить текст по столбцам" считая за разделитель пробел и дальше сохранить в csv. Ты, насколько я понял, хочешь обойтись штатными средствами OS.
@echo off
for /f "tokens=1-5 " %%a in (list.txt) do (
xcopy "%%~b" "%%~e"
)
Открыл для себя еще одну новую вещь. Попробую использовать для обработки логов телефонии.
Радуют адекватные и полезные ответы, когда вместо "я такой умный, спрошу ка что такое C:\" человек берет и пишет красивое решение.
обработки логов телефониитогда всё-таки лучше sed, awk и grep
P.S. Я предпочитаю GnuWin CygWin-у
В примере с "awk '{"cp -R " $2 " " $5}' list.txt" я так понял что берутся значения из второго и пятого столбца. Команда считает что столбцы разделены пробелами. Как в примере. Или я не так понял?Любая последовательность white-символов (например пробел, табуляция).
Для того чтобы из такого файла сформировать csv, в котором значения разделяются запятыми и очищены от мусора необходимо приложить некоторые усилия.
Пример?
Другой разделитель - есть ключик -F.
1. Ставишь MSYS (ну или Cygwin, tastes differ).Ну вообще скорее всего эта операция делается один раз, так что любые средства, которые есть, подходят ок. И эксель - норм решение или что еще под рукой есть.
все эти grep, awk, sed, wc, ls на самом деле вызывают зависимость, без них потом как без рук. и еще for башевый.
цигвин не нужен
while read a b; do cp $a $b; done < list.txt
Тут проблема будет с пробелами в именах, их предварительно надо в списке заескейпить.
пробелами в именахОчень верно подмечено! Варианты, предложенные выше, не обработают такие ситуации.
Если рассматривать более общий случай, то в именах файлов/папок могут встречаться не только пробелы, но и другие "разделители" вроде "скопировать", "Из" и пр. Тогда нужно находить начало пути "X:\" и отрезать перед этими символами строку определенной длинны.
Я поэтому сразу и спросил: что за хуйня X:\? В нормальных ОС ограничения на символы из которых может состоять имя файла очень лаконичны, поэтому легко их обрабатывать. Что в винде с ограничениями мне не понятно. Может ли имя файла содержать двоеточие?
В нормальных ОС ограничения на символы из которых может состоять имя файла очень лаконичны, поэтому легко их обрабатывать.UTF8 несколько портит дело только
Что в винде с ограничениями мне не понятно. Может ли имя файла содержать двоеточие?В винде имя файла/папки не может содержать символов \ / : * ? < > |
Может ли имя файла содержать двоеточие?двоеточие - это знак обращения к ntfs потоку. внутри файла может быть древообразная структура потоков. Вот для них двоеточие и и юзается
Очень верно подмечено! Варианты, предложенные выше, не обработают такие ситуации.
awk -F 'Из | скопировать в ' '{"cp \"" $2 "\" \"" $3"\""}' list.txt
Насчет кодировок сейчас не скажу, цигвина под рукой нет, возможно, придется что-нибудь где-нибудь прописать.
А если будет файл "С:\Папка1\Из какой папки скопировать в какую\1.txt" то уже будет сбой.
Кавычками надо пользоваться тогда.
Кавычками надо пользоваться тогда.Не всегда исходные данные предоставляют в таком виде, как мы хотим.
Кто-то присылает картинки в вордовском документе и просит выложить их на сайт, кто-то кавычки не ставит
Можно допиливать скрпит, чтобы он выбирал только нужные данные, хотя, на мой взгляд, вопрос уже обсудили со всех сторон.
docs.google.comим уже можно пользоваться без передачи всей своей инфы большому брату?
Из скопировать в скопировать в скопировать в скопировать в
Скрипт сломается, когда в текущем каталоге будут каталоги "скопировать в" и "скопировать в скопировать в".
Любой скрипт сломается.
Человек-оператор тоже ничего не поймет.
Берем из первого столбца последний символ, от второго отрезаем N символов с конца и получаем путь "Откуда"
Для получения пути "Куда" берем последний символ из второго столбца и объединяем с 3м.
Ты заметил, что у меня относительные пути?
используя разделитель ":"Так какой же разделитель ":" или?
Давай сразу пример как выглядит строка, из которой нужно получить имена файлов.
Если мы обсуждаем работу скрипта/обработки на примере из моего поста
Из C:\Папка1\38816221 скопировать в D:\Папка2\56100344
то там всегда будут двоеточия после буквы диска.
Пример:
Из C:\Папка1\Скопировать в скопировать в Из\123 скопировать в D:\Папка2\Скопировать в скопировать Из в 1\321
Если будут относительные пути, напрмер
Из Скопировать в скопировать в скопировать в скопировать в скопировать в
то тут обработать действительно не получится. можно понять как
Из Скопировать в скопировать в скопировать в скопировать в скопировать в
так и
Из Скопировать в скопировать в скопировать в скопировать в скопировать в
Тут уже нужно обрабатывать как нештатную ситуацию и составлять список данных, которые скопировать невозможно.
В Excel такая проверка и выборка делается элементарно с помощью фильтров - то что не удалось разбить по двоеточиям или разбить по "скопировать в" (получилось больше 3 столбцов).
sed 's/^Из \(.*\) скопировать в \(.:.*\)/cp -R "\1" "\2"/' | awk '{system($0)}'
Поясни, пожалуйста, что тут что обозначает. Здесь мне уже догадаться сложно ^.^
Можно.
Эээ. Почитай про регекспы.
Оставить комментарий
woofster
сейчас нет нормального интернета под рукой. скажите, а как из командной строки скопировать несколько папок одновременно, вместе с их содержимым?