Xcopy аналог в linux
Обновлено: 04.07.2024
Переключатель /I (не /F как вы упомянули в своем вопросе) не позволяет xcopy спрашивать, является ли место назначения файлом или каталогом, только если указано несколько исходных файлов, поэтому, если источником является каталог, или если подстановочные знаки ? или * используются. Если место назначения уже существует, такое приглашение никогда не появится.
Существуют следующие сценарии (в зависимости от предоставленных значений %source% и %target% ):
один исходный файл, местом назначения является файл:
переключатель /I бесполезен, поэтому вам нужно передать F в командную строку xcopy :
при условии, что задан переключатель /Y (для принудительной перезаписи), вы также можете заранее создать целевой файл (пустой файл)
один исходный файл, местом назначения является каталог:
или вы можете просто добавить \ к месту назначения:
, хотя это вызывает проблемы, когда %target% указывает текущий каталог диска как D: например, потому что D: означает текущий каталог этого диска, тогда как D:\ означает его корневой каталог;
или вы заранее создаете каталог назначения:
несколько исходных файлов, местом назначения является файл:
обычно это бессмысленная ситуация, потому что вы указываете xcopy копировать каждый исходный файл в один и тот же файл назначения, пытаясь таким образом перезаписать она;
несколько исходных файлов, местом назначения является каталог:
переключатель /I здесь имеет смысл:
опция pipe также работает здесь:
также добавляет \ к месту назначения (относительно ограничения, упомянутого выше):
или вы заранее создаете каталог назначения:
Заключение
Самое гибкое и безопасное решение - передать желаемый выбор ( F или D ) в командную строку xcopy . (Обратите внимание, что запрос зависит от локали.)
Дополнение
В вашем фрагменте кода есть некоторые незначительные проблемы, о которых я хочу упомянуть здесь:
- как правило, вы должны использовать \ в качестве разделителя пути, поскольку это стандартный символ Windows для этой цели (хотя / в большинстве случаев тоже работает);
- к вашему второму -1111 /code> командная строка; если это составляет пароль для ресурса, его следует переместить перед параметром net use ; в противном случае просто удалите его;
- ваши командные строки /USER создают проблемы с некоторыми специальными символами (например, set , & , ^ , ( ); чтобы избежать этого, укажите ) и set "source=%
* Аналог в Windows - подразумевается cmd.exe (интерпретатор командной строки Windows).
Примечание.
Если посмотреть внимательно, то можно заметить, что многие команды в Linux носят такое же имя, как и в MS DOS. Это следствие того, что у обеих операционных систем был общий предок — операционная система UNIX, да и в дальнейшем влияние на Linux оказывали новые идеи, применяемые в MS DOS/Windows.
Часть материала взята с источника.
Кирилл
А много ли таких команд которые неприменимы к противоположным версиям ОС?
Понятно,конечно,что sfc для Windows из под Linux не выполнить.
Но все таки есть ли команды несовместимые или даже противопоказанные для совместного использования в ОС?
А может есть наоборот полезные команды в Linux которых нет в Windows?
Преимущества?
Dragokas
Very kind Developer
Но все таки есть ли команды несовместимые или даже противопоказанные для совместного использования в ОС? Понятно,конечно,что sfc для Windows из под Linux не выполнить.sfc - это утилита, а не команда.
На самом деле половина приведенных здесь названий - это утилиты из %windir%\system32:
fc.exe, comp.exe, cmd.exe, attrib.exe, xcopy.exe, robocopy.exe, diskpart.exe, sort.exe, systeminfo.exe, print.exe, find.exe
При этом оболочка bash в Linux зачастую имеет гораздо больший функционал аналогов этих команд.
И отличный внутренний хелп по каждой. Именно поэтому есть народные умельцы, которые портировали утилиты из линукс в Windows:
1) UnxUtils (sourceForge - коллективная разработка)
2) UnixUtils (от Алексея Курякина) - почитайте обзор и примеры, скачать инсталлятор.
Я не большой знаток Linux, но в следующем обзоре я конкретизирую и расширю перечень, какие из команд cmd.exe являются внутренними, какие внешними утилитами.
Гимаев Наиль
Активный пользователь
* Аналог в Windows - подразумевается cmd.exe (интерпретатор MS-DOS). несовместимые или даже противопоказанные для совместного использования в ОС Не совместимых полно. Главное отличие в ключах. В windows ключи начинаются со слеша, в POSIX-системах с тире (короткие ключи) или с двух тире (длинные ключи), например -h и --help. Если хочется большей совместимости по командам, то лучше использовать PowerShell-скрипты. Многие команды перекочевали в PowerShell из Linux. И формат ключей тоже. Но писать совместимые скрипты не получится, т.к. скрипты в Linux дают на выходе строку, которую нужно парсить, а команды PowerShell дают объекты, свойства которых можно смотреть и даже вызывать методы объектов.Подход, когда программа на входе ждёт строку и отдаёт строку на выходе называется unix-way. Многие программы в Linux не делают всю работу сами, а просят сделать часть работы другие программы. Большинство GUI программ ни делают ни чего. Они позволяют пользователю ввести данные, потом передают эти данных на вход какой-нибудь программе (например в ping), а потом оформляют и показывают пользователю результат полученный на выходе программы. И таких программ которые ожидают, что они находятся в стандартном Linux-окружении не мало. Специально под них в windows придумали Сygwin. Cygwin - это набор программ и библиотек, позволяющий запускать Linux-скрипты под Windows. Недостаток CygWin это избыточность. Для простых задач вполне хватит и GnuWin32.
Dragokas
Very kind Developer
Да я все крутил-крутил как по-короче, чтоб в таблицу вставить . В итоге докрутил. (исправлю).
Есть аналоги, к примеру, знак:
& (амперсанд) в Windows - это знак ; (точка с запятой) в Linux
Здесь выполняется команда1, после завершения работы которой будет выполнена команда2.
А вот прямой замены знаку & (из Linux-a) нет. Этот знак позволяет выполнить команду1 в фоне, и не ожидая завершения ее работы сразу же начать выполнение команды2. Придется делать так:
- для Windows:
Копирование файлов с проверками (подобие xcopy из win)
Софт под Linux, разные программы, но только связанные с LinuxМодератор: /dev/random
Копирование файлов с проверками
я съэкономил на покупке МедиаБанка (типа мониторчик и 2.5hdd в маленькой коробочке)
взял старый ноут Sony (PCG505) 200мhz, он очень маленький, поставил туда HDD на 30Гб, PuppyLinux (не initrd, а как обычный линукс), кастрировал все что только можно - машина зверь!
Но вот в том МедиаБанке который я не купил, была фишка - "копировать и проверять". Работает медленнее, зато уверенность, что все фотки с флешки скопировались и скопировались правильно. мало ли какой аппаратный сбой.
в мире Win есть xcopy. хотя я ее никогда не использовал.
если написать скрипт самому, то слишком много раз файл считывать - 2 раза с флешки, один раз с винта и один раз писать на винт.
проверить фотки посмотрев их не получиться, мало памяти и проц слабый.
Проблема в том, что я не предстваляю где может случиться сбой - при чтении с флешки или при записи на внетренний HDD?
проще конечно заюзать perl и читать с флешки по 1024кб и скармливать md5_sum() и параллельно писать в файл на HDD.
не хочу изобретать велосипед. Поиск ничего не дал, кроме dd_rescue и GNU ddrescue. но помоему это не то.
ТД:
в ноуте PCMCIA USB2.0. чтение с флеш не выше 10мб/с, чтение с hdd 9-11 Мб/с. запись конечно медленнее.
не очень скоростные SD карты по 2 Гб. (ок. 7Мб/с чтение)
фотки по 3-4 Мб JPG и 9 Мб RAW
напоминает какой-то маркетинговый ход, если честно. железо, кстати, само по себе не такое уж глупое и проверки там внутри и так присутствуют. проще конечно заюзать perl и читать с флешки по 1024кб и скармливать md5_sum() и параллельно писать в файл на HDD.
при записи писать CRC32, при чтении - проверять.
MD5 очень долго, даже на новых CPU, а CRC32 вполне достаточно. скрипт на bash'е даже такой бегинер как я за часок наваяет
Скоро придёт
Осень
и правда, md5 положил его на лопатки, а crc считает быстро.
хотелось просто все в одном флаконе. создать текстовый файлик с данными [путь] [crc32] легко. и также легко его заюзать для проверки созданных копий.
Но это похоже на костыли. хочется прекрасного эллегантного.
да-да!
Когда Вы качаете файлик с внешней машины, то на каждом этапе идет проверка. Глупо не доверять железу. Особенно когда приходится перезакачивать битое
короче проблема решилась.
лень искать|выбирать, напиши свое
перл скрипт которому передаются 2 абсолютных пути
запускающий вызовы оболочки find [путь] -type f для формирования списка оригиналов
и cksum для генерации контрольной суммы
подготовительные вещи не включая вызов cksum на папке с 93 фотками (340Мб) тратит 0.5сек. (засекал `time [program]`)
(P1 200mHz, 32RAM)
полный вызов 1.5 минуты.
но кажется это какая-то кастрированная утилита COMPARE FOLDERS собственного написания.
надо сделать так, чтобы она вначале еще и копировала сами файлы. тогда хоть какой-то смысл.
Я вспомнил чего страшился!
и правда, чего переживать - HDD новый, комп под Linux-ом - какие еще нужны гарантии
Это была передача или статья про компьютер в космосе. Что они там используют довольно убогую по производительности аппаратуру, но зато она устойчива к бомбардировке электронами.
А раньше компы в серверной начинали глючить когда заходила тетя из бухгалтерии в синтетическом наряде.
сейчас конечно таких проблем нет, но например, когда передаешь видео по FireWare от камеры к компу и положить мобильник на провод, можно увидеть много эффектов.
Тернист путь мыслей блуждающих
часто ограничить и сформулировать функциональность труднее ее реализации.
выявленна самая главная проблема:
произошло чтение с внешнего устройства - нет уверенности что переданное не имеет сбоев.
просим передать еще раз, а оно берется из кэша. не знаю как заставить перечитать файл игнорируя возможную его копию в кэше.
идем по пути наименьшего сопротивления. т.к. оперативной памяти всего 32 мб. а доступно для кэша не более 15 (в течении недели проверял вывод /proc/meminfo)
данные будут замещены после 5-ит JPG файлов (копируем фотки по 3 мб не меньше) или 2-х RAW.
скрипт на Perl, т.к. более знаком чем с bash и прочими
скрипту даем 2 абсолютных пути: source и target
на source натравливает "find /source/path -type f" и получаем список файлов с абсолютными путями
помещаем в массив который shift-им и скармливаем `cp -pu /souce/path/f1 /target/path/f1`
т.к. массив уменьшается - имеем плюс - счетчик сколько фалов осталось скопировать (против немого `cp -Rpu`)
из проблем - нужно создать структуру подпапок заранее (find /source/path -type d) и скармливаем результаты `mkdir /target/path/..`
что интресно - на эксперементальном компе (PCG-505G P1 200mHz 32mb RAM) операция копирования cp -Rpu работает на 10% дольше perl скрипта тойже функциональности.
(видимо из-за проверок и создания вложенных папок)
(встречал как-то скрипт подсчета размера папки с использованием find, ls -l и awk работающего очень быстро)
запускаем sync на всякий случай.
скопировав файлы приступаем к их проверке.
основываясь на том, что из кэша выдавливается после 3 фоток, начинаем проверку в том же порядке как копировали.
используя тот же массив, в который скопировали пути к оригинальным файлам, начинаем провеку.
если считаная повторна пара по crc совпадает пишем в консоль ОК и в любом случае в summs.crc записываем скс о нем
если произошел сбой, пишем в copy.log комманд на повторное копирование типа "cp -pi /source/path /target/path" (в summs.crc для него уже будет запись, только вера ей на 1/2)
если оперативки прибаввится - то на первый план выходит проблема повторно запросить фал напрямую с устройства (и внутреннего и внешнего) минуя кэш.
сдесь бы помог dd, котя я нашел пару статей про то как ядро работает с кэшем и у меня нет уверенности что даже dd получает данные напрямую.
немного статистики (напомню, что это PCG-505G P1 200mHz 32mb RAM 30Gb Fujitsu 5400rpm noDMA):
данные для непрерывного потока: чтение через hdparm -t /dev/dev, а запись через dd из /dev/zero в any.file
резульаты для самопальных прог (тестовые файлы 340мб, 93 шт JPG/RAW, на 2Gb SD kingson с которой hdparm смог выжать 5 мб/с чтения)
по идее последний пунк должен быть суммой хотябы голого копирования и провеки из двух источников. почему-то получилось дольше. лень разбираться.
по итогу имеем 4.3 мб/с системной функции копирования и 1.8 мб/с самопальной с проверками.
т.е. более чем в 2 раза. скжем 1800кб - 7 минут против почти 20-ти.
и это при том, что используя cksum, а это помоему crc16, а не crc32.
лично мне кажется, что хакнуть dd и просить его считывать маленькими блоками по 2 раза с soucePath и сравнивать чтобы они были одинаковыми, а потом писать в targetPath и тут же считывать - работало бы быстрее чем подсчитывать суммы для целого файла.
Хотя мой, только что изобретенный кривенький велосипед, меня устраивает.
лень - лучший аргумен ничего не делать.
Копирование файлов - одна из задач, наиболее часто возникающих перед пользователями персонального компьютера. Конечно, можно открыть файловый менеджер, войти в нужную папку и скопировать файл с помощью контекстного меню - тут не о чем говорить. Но в этой статье я хотел бы рассмотреть копирование файлов в Linux с помощью терминала.
Не всегда есть доступ к файловому менеджеру: из-за различных поломок графическая оболочка на домашнем компьютере может быть недоступна, а на серверах используется только консольный интерфейс. К тому же копирование файлов Ubuntu через терминал намного эффективнее, и вы сами в этом убедитесь. Сегодня мы рассмотрим не только обычное копирование командой cp Linux, но и не совсем обычное: с помощью tar и find.
Утилита копирования файлов cp
Название утилиты cp - это сокращение от Copy, что означает копировать. Утилита позволяет полностью копировать файлы и директории.
Синтаксис и опции
Общий синтаксис cp выглядит вот так:
$ cp опции файл-источник файл-приемник
$ cp опции файл-источник директория-приемник/
После выполнения команды файл-источник будет полностью перенесен в файл-приемник. Если в конце указан слэш, файл будет записан в заданную директорию с оригинальным именем.
Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:
- --attributes-only - не копировать содержимое файла, а только флаги доступа и владельца;
- -f, --force - перезаписывать существующие файлы;
- -i, --interactive - спрашивать, нужно ли перезаписывать существующие файлы;
- -L - копировать не символические ссылки, а то, на что они указывают;
- -n - не перезаписывать существующие файлы;
- -P - не следовать символическим ссылкам;
- -r - копировать папку Linux рекурсивно;
- -s - не выполнять копирование файлов в Linux, а создавать символические ссылки;
- -u - скопировать файл, только если он был изменён;
- -x - не выходить за пределы этой файловой системы;
- -p - сохранять владельца, временные метки и флаги доступа при копировании;
- -t - считать файл-приемник директорией и копировать файл-источник в эту директорию.
Примеры копирования файлов в linux
Теперь, когда вы знаете основные опции, можно перейти к практике. Например, мы хотим скопировать некую картинку из домашней папки в подкаталог pictures:
Или можем явно указать имя новой картинки:
Копирование папок осуществляется с помощью ключа -r:
После выполнения этой команды копирования
/папка будет скопирована в папку
/Документы. Главное, не забывайте поставить слэш в конце выражения или использовать опцию -t. Иначе папка
/документы будет перезаписана.
По умолчанию команда cp Linux перезаписывает существующие файлы или папки, но можно заставить утилиту спрашивать, нужно ли перезаписывать каждый файл, если вы не уверены в правильности составления команды:
Есть и противоположная опция -n, означающая "никогда не перезаписывать существующие файлы".
Опция -u полезна в следующем случае: вы знаете или предполагаете, что в директории, куда копируется файл, есть старая его версия, тогда оператор -u выполнит замену на новую версию:
Сp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:
Если нужно применить более сложные регулярные выражения, придётся комбинировать утилиту cp с find или egrep.
В случае, если важно сохранить права доступа к файлу и его владельца, нужно использовать опцию -p:
Для упрощения использования команды можно применять синтаксис фигурных скобок. Например, чтобы создать резервную копию файла, выполните:
Будет создан файл с таким же именем и расширением .bak
По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.
Копирование файлов по регулярным выражениям в Linux
В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:
find . -name 7 -exec cp <>
Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ <> - подставляет имя каждого файла.
Но не find'ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:
/ | egrep '[a-zA-Z]' | xargs cp -t
Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.
Копирование содержимого файлов в Linux
Вы можете не только копировать сами файлы, но и управлять их содержимым. Например, склеить несколько файлов в один или разрезать файл на несколько частей. Утилита cat используется для вывода содержимого файла, в комбинации с операторами перенаправления вывода Bash вы можете выполнять копирование содержимого файла Linux в другой файл. Например:
cat файл1 > файл2
Если файл был не пустым, он будет перезаписан. Или мы можем склеить два отдельных файла в один:
cat файл1 файл2 > файл3
Специальное копирование файлов в Linux с помощью tar
Linux интересен тем, что позволяет выполнять одно и то же действие различными путями. Копирование в Linux тоже может быть выполнено не только с помощью cp. При переносе системных файлов в другой каталог, резервном копировании системных файлов и т.д. важно чтобы сохранились атрибуты, значения владельцев файлов и символические ссылки как они есть без какой-либо модификации.
tar cf - /var | ( cd /mnt/var && tar xvf - )
Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.
Выводы
Теперь вы знаете, как выполняется копирование файлов Ubuntu и в Linux в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!
Читайте также: