Как правильно... Копируем файлы с внешних носителей в терминале Linux

debianeach

Опубликован:  2020-02-03T12:36:56.901947Z
3300

В этом выпуске блога поговорим о копировании файлов, и в частности, о копировании каталогов и файлов с внешних носителей в терминале Linux. Дебианыч в очередной раз попытается вникнуть в мелкие детали процесса копирования файлов и каталогов, показать основные просчёты начинающих пользователей при копировании файлов с внешних носителей на примере Debian buster и дать несколько полезных советов новичкам.

Как известно, для копирования файлов в терминале Linux предназначена низкоуровневая утилита cp, которая в обязательном порядке устанавливается в систему в составе пакета coreutils. Основная справочная информация о cp представлена на соответствующей странице man, и её можно увидеть в терминале после ввода команды man cp. Кроме этого, формы использования, список ключей и краткие пояснения можно увидеть набрав в терминале команду cp --help.

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

Итак, в моём текущем каталоге имеется pdf-файл. Мне необходимо получить его копию здесь же - в текущем каталоге. В самом общем случае, и новички обычно делают именно так, копирование файла можно осуществить следующей командой.

cp talon.pdf document.pdf

LjtWVxewqy.png

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

OiUV4IqBF1.png

Далее, я изменю режим доступа к файлу document.pdf и снова скопирую его с новым именем в текущий каталог.

chmod g+w document.pdf
cp document.pdf newcopy.pdf

N3jBib3POs.png

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

1NkbVRNcCs.png

Полученные файлы в текущем каталоге мне больше не нужны, поэтому я их удаляю - rm -f *, и сконцентрирую своё внимание на файлах, хранящихся на внешних носителях, и процессе их копирования.

В моём хозяйстве есть DVD-диск, на который когда-то давным-давно я записывал на долгое хранение некоторые файлы и каталоги. На примере этого диска я и разберу детально процесс копирования файлов и каталогов. Вставляю диск в привод и монтирую его.

udisksctl mount --block-device /dev/sr0

NZq33a6bIF.png

Как видно на снимке экрана выше, диск смонтировался без ошибок, и корень диска я ожидаю увидеть в точке монтирования /media/cdrom0, давайте посмотрим на оглавление этого каталога.

ls -lR /media/cdrom0/

SLt54xUTBj.png

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

cp -r /media/cdrom0/* .

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

8GtcmwmAxC.png

Здесь следует обратить внимание, что в команде для копирования я задал ключ -r - рекурсивное копирование каталогов, использовал мета-символ *, чтобы не перечислять имена всех копируемых файлов, и задал текущий каталог как место назначения для копируемых файлов и каталогов с помощью символа . (точка). И, так как режим доступа только для чтения копий сохранился, я получил небольшую головную боль, потому что режим доступа каталогов отличается от режима доступа файлов и изменить его рекурсивно для каталогов и файлов одной командой не получится. Не пойдёт! Удаляю все скопированные файлы, и для этого мне придётся воспользоваться услугами sudo, увы.

sudo rm -rf *

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

cp -r --preserve=timestamps --no-preserve=mode /media/cdrom0/ .

В команде появились два новых ключа:

  • --preserve=timestamps - даёт возможность сохранить дату последней модификации исходных файлов и каталогов для полученных копий;
  • --no-preserve=mode - даёт возможность не сохранять режим доступа исходных файлов и каталогов для полученных копий.

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

hncPBNMPds.png

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

rm -rf *

4FVckSHjIs.png

Давайте рассмотрим ещё один пример внешнего носителя - USBFlash-накопитель с файловой системой Fat32. В моём распоряжении есть такая флешка, и на ней записаны некоторые файлы и каталоги. Как известно, смонтировать такой накопитель можно двумя возможными способами:

  1. С помощью утилиты udisksctl;
  2. С помощью утилиты mount и соответствующих опций.

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

Монтирую свою флешку при помощи udisksctl, предварительно определив идентификатор раздела на ней командой lsblk.

udisksctl mount --block-device /dev/sdb1

JShwMBybBO.png

Теперь нужно посмотреть на оглавление указанной точки монтирования и обратить внимание на атрибуты файлов и каталогов в ней.

ls -lR /media/newbie/FLASH-DRIVE/

9cY3dCbaYi.png

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

udisksctl unmount --block-device /dev/sdb1

И попытаюсь снова смонтировать его, но на этот раз при помощи утилиты mount и без уточнения опций монтирования - как обычно делают начинающие пользователи Linux.

sudo mount /dev/sdb1 /mnt

На этот раз для монтирования потребовались права суперпользователя и программа sudo. Посмотрим на атрибуты файлов в точке монтирования этого носителя.

ls -lR /mnt

XTEZH77gxO.png

Аха... На снимке экрана видно, что режим доступа к вложенным каталогам никак не изменился, а вот вложенные файлы стали исполняемыми - все! Как следствие, если их скопировать в хомяк с помощью cp и при этом не задать ключ --no-preserve=mode, то они и скопируются как есть, и, учитывая порядок вложенности, чтобы изменить режим доступа к этим файлам, придётся приложить некоторые усилия, об этом, возможно, поговорим в одном из выпусков блога когда-нибудь скоро. :)

Подведём итог несколькими дельными советами для начинающих осваивать работу в терминале и желающих скопировать файлы с внешних носителей в хомяк (домашний каталог) с помощью утилиты cp:

  1. Аккуратно и грамотно монтируйте внешние носители, используйте соответствующие ключи и задавайте необходимые опции монтирования, если монтируете носитель программой mount;
  2. Перед копированием файлов обращайте внимание на атрибуты каталогов и файлов в точке монтирования сменного носителя, вполне вероятно, что вам захочется какие-то атрибуты сохранить для копий, а какие-то - нет;
  3. При копировании каталогов и файлов с помощью утилиты cp старайтесь осознанно и грамотно управлять атрибутами полученных копий с помощью ключей --preserve и --no-preserve, это поможет избежать некоторых необязательных трудностей впоследствии;
  4. Осваивая консольные утилиты внимательно читайте их man страницы, и полагайтесь на изложенную в них информацию, формируя свою моторику и правильные приёмы работы в консоли.
Комментарии: