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

Команда cp — копирование файлов в Linux из терминала

Задачи по копированию файлов из одного места в другое возникают у пользователей чаще всего, скопировать нужные объекты можно через менеджер файлов, в котором следует найти нужную директорию и после воспользоваться контекстным меню. Однако есть гораздо более простые способы, в этой статье речь как раз пойдет о них, точнее о копировании файлов в Линукс из консоли.

Знание о команде cp полезны, ведь файловый менеджер может некорректно работать из-за проблем с графической оболочкой. Серверные компьютеры вообще управляются только через консоль. Перемещать файлы с помощью терминала очень удобно, в этом может убедиться каждый пользователь. Скопировать файлы можно как с помощью утилиты cp, так же используя tar и find.

Синтаксис

Рассмотрим синтаксис утилиты.

cp [параметр] [что копировать] [куда купировать]

Как только команда будет активирована, отправляемый файл перенесется в место для приема, при указании на конце файла значка «/» он также будет перенесен, но с новым именем.

  • —attributes-only – переместить не сам файл, а только данные пользователя и флаги доступа;
  • -f —force – вместо старых данных записать новые;
  • -i —interactive – спросить о необходимости переписывать старую информацию;
  • -L – создать копию не ссылок-символов, а того, что находится по этим ссылкам;
  • -n – оставить старые файлы на их месте;
  • -P – игнорировать ссылки-символы;
  • -r – скопировать данные Linux используя рекурсию;
  • -s – ничего не копировать, просто создать ссылки-символы;
  • -u – копировать файл, но при условии, что он уже был изменен;
  • -x – проводить все действия только внутри одной системы файлов;
  • -p – во время копирования сохранить все информацию о файле;
  • -t – команда дает возможность считать файл для приема директорией, и отправлять в него нужный объект;

Примеры

Для первого примера, скопируем файл /root/katalog/dokument в папку, которая называется «newpapka».

cp /root/katalog/dokument /root/newpapka

Cкопируем «dokument» и «file» в каталог «newpapka».

cp /root/katalog/dokument /root/katalog/file /root/newpapka

Часто бывает так, когда копируешь несколько файлов, желательно выводить информацию, что происходит. В этом поможет опция «-v».

cp -v /root/katalog/dokument /root/katalog/file /root/newpapka

Команда cp устроена так, что все отправляемые с ее помощью файлы перезаписываются, однако программу можно заставить спрашивать пользователя о том, нужно ли перезаписывать старые данные, для этого есть специальная команда:

cp -i /root/katalog/dokument /root/newpapka

Существует альтернатива данной функции, благодаря запросу «-n» можно сказать программе, чтобы она вообще не перезаписывала файлы.

Данная возможность будет полезна при следующей ситуации: пользователю известно, что в определенном месте для копирования уже содержится тот же файл, но с устаревшей версией, а с помощью функции «-u» можно безболезненно перезаписать старые данные:

cp -u /root/katalog/dokument /root/newpapka

Для копирование папки со всем ее содержимом необходимо использовать параметр -r.

cp -r /root/katalog /root/newpapka

ВАЖНО! Как видно из скриншота, данный способ скопирует всю папку и поместит ее в новую директорию.

Если нужно только сделать копию всех файлов без папки, то опция -r не подойдет.

Читайте также:  Windows 10 скоростная сборка

Можно сделать так:

cp /root/katalog/* /root/newpapka

Как видно из примера выше, команда cp работает со знаками «*» и «?», следующий запрос, займется копированием всех файлов, чье название начинается с new:

cp /root/katalog/new* /root/newpapka

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

С ее помощью появится резервный файл, который имеет расширение, указанное в скобках.

Одним из неудобств функции cp является то, что она не показывает количество скопированной информации, это мешает, особенно когда приходится работать с тяжелыми файлами. Полоску прогресса можно увидеть, если использовать функцию cv.

Регулярные выражения

Для выполнения других, более сложных функций, придется использовать вместе с cp такие утилиты find и egrep.

С помощью утилиты find есть возможность использовать команды для выявления расположения файлов. Пользователь может найти данные с использованием find, а затем скопировать их, используя функция для копирования.

Вот пример, в нем проводится копирование файлов, которые содержат цифры от 1 до 5:

find /root -name 5 -exec cp <> /root/newpapka \;

ВАЖНО! Обязательно в конце команды нужно ввести «;», в противном случаи будет ошибка — exec аргумент не задан.

  • /root — каталог где производить поиск.
  • -name — критерии поиска.
  • 2 — что искать, в данном случаи от одного до пяти.
  • -exec — аргумент, который говорит, что нужно запустить команду.
  • <> — подставляет имя каждого файла.

Сделать то же самое можно и не прибегая к find, можно обратиться к утилите ls, выбрать нужные файлы, используя регулярные выражения egrep, затем отправить их под контроль cp, применяя при этом xargs:

ls -1 /root | egrep ‘2’ | xargs cp -t /root/newpapka

Данный способ не отличается особым удобством, однако использовать его можно. При работе с ним начнется копирование файлов из основной директории, чьи имена содержат лишь цифры от 1 до 5.

Копирование при помощи перенаправления вывода

В операционной системе Linux есть специальный символ «>», который означает перенаправление вывода.

Благодаря этой возможности можно не только переносить файлы, но и работать с их составляющими. Есть возможность соединить несколько файлов или наоборот разрезать их.

Используя cat можно выводить на экран основные данные файла, а затем, используя bash, пользователь сможет переносить составляющие файла из одного места в другое.

cat file1 > newfile

Одной из особенностью Linux является то, что в нем одно и то же действие можно выполнять, используя несколько различных команд.

Скопировать данные можно не только с помощью cp. Когда важные системные файлы отправляются в другое место или происходит создание резервных копий данных, нужно, чтобы такие вещи как атрибуты, владельцы данных, ссылки-символы были сохранены без каких-либо изменений.

С помощью cp так делать можно, однако на помощь придется позвать утилиту tar, чтобы она начала работу следует написать в cp «-p».

В качестве примера будет приведен туннель – одна часть запроса архивирует файл и отправляет его, другая – разархивирует и отправляет в нужное место:

tar cf — /lfc | ( cd /epl/lfc && tar xvf — )

С помощью данной команды все из папки /lfc отправляется в папку /epl/lfc. Таким способом можно скопировать любую информацию с компьютера, даже если это операционная система.

Теперь почти каждый пользователь знает, как копировать файлы в ОС. С помощью терминала делать это можно быстро, главное – запомнить все нужные команды.

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума
Читайте также:  Депин линукс 20 1

Копирование файлов с проверками (подобие xcopy из win)

Модератор: /dev/random

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

Сообщение kawey » 11.04.2009 20:59

я съэкономил на покупке МедиаБанка (типа мониторчик и 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

Re: Копирование файлов с проверками

Re: Копирование файлов с проверками

Сообщение diesel » 11.04.2009 21:24

Re: Копирование файлов с проверками

Сообщение drBatty » 11.04.2009 22:37

Скоро придёт
Осень

Re: Копирование файлов с проверками

Сообщение kawey » 12.04.2009 00:09

и правда, md5 положил его на лопатки, а crc считает быстро.

хотелось просто все в одном флаконе. создать текстовый файлик с данными [путь] [crc32] легко. и также легко его заюзать для проверки созданных копий.

Но это похоже на костыли. хочется прекрасного эллегантного.

Re: Копирование файлов с проверками

Сообщение kawey » 12.04.2009 00:22

короче проблема решилась.

лень искать|выбирать, напиши свое

перл скрипт которому передаются 2 абсолютных пути

запускающий вызовы оболочки find [путь] -type f для формирования списка оригиналов
и cksum для генерации контрольной суммы

подготовительные вещи не включая вызов cksum на папке с 93 фотками (340Мб) тратит 0.5сек. (засекал `time [program]`)
(P1 200mHz, 32RAM)
полный вызов 1.5 минуты.

но кажется это какая-то кастрированная утилита COMPARE FOLDERS собственного написания.

надо сделать так, чтобы она вначале еще и копировала сами файлы. тогда хоть какой-то смысл.

Re: Копирование файлов с проверками

Сообщение kawey » 12.04.2009 00:40

Я вспомнил чего страшился!

и правда, чего переживать — HDD новый, комп под Linux-ом — какие еще нужны гарантии

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

сейчас конечно таких проблем нет, но например, когда передаешь видео по FireWare от камеры к компу и положить мобильник на провод, можно увидеть много эффектов.

Re: Копирование файлов с проверками

Сообщение kawey » 13.04.2009 01:07

Тернист путь мыслей блуждающих

Читайте также:  Windows chip код активации

часто ограничить и сформулировать функциональность труднее ее реализации.

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

идем по пути наименьшего сопротивления. т.к. оперативной памяти всего 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 и тут же считывать — работало бы быстрее чем подсчитывать суммы для целого файла.

Хотя мой, только что изобретенный кривенький велосипед, меня устраивает.
лень — лучший аргумен ничего не делать.

Источник

Оцените статью