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 очень долго, даже на новых CPU, а CRC32 вполне достаточно.

и правда, 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 в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!

Читайте также: