Ошибка копирования файла в linux

Время на прочтение
3 мин

Количество просмотров 165K

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

Допустим нам нужно скопировать всё из папки /source в папку /target.

Первое, что приходит на ум это:

cp /source/* /target

Сразу исправим эту команду на:

cp -a /source/* /target

Ключ -a добавит копирование всех аттрибутов, прав и добавит рекурсию. Когда не требуется точное воспроизведение прав достаточно ключа -r.

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

.profile
.local
.mc

и тому подобные.

Почему же так произошло?

Потому что wildcards обрабатывает shell (bash в типовом случае). По умолчанию bash проигнорирует все файлы начинающиеся с точек, так как трактует их как скрытые. Чтобы избежать такого поведения нам придётся изменить поведение bash с помощью команды:

shopt -s dotglob

Чтобы это изменение поведения сохранилось после перезагрузки, можно сделать файл wildcard.sh c этой командой в папке /etc/profile.d (возможно в вашем дистрибутиве иная папка).

А если в директории-источнике нет файлов, то shell не сможет ничего подставить вместо звёздочки, и также копирование завершится с ошибкой. Против подобной ситуации есть опции failglob и nullglob. Нам потребуется выставить failglob, которая не даст команде выполниться. nullglob не подойдёт, так как она строку с wildcards не нашедшими совпадения преобразует в пустую строку (нулевой длины), что для cp вызовет ошибку.

Однако, если в папке тысячи файлов и больше, то от подхода с использованием wildcards стоит отказаться вовсе. Дело в том, что bash разворачивает wildcards в очень длинную командную строку наподобие:

cp -a /souce/a /source/b /source/c …… /target

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

getconf ARG_MAX

Получим максимальную длину командной строки в байтах:

2097152

Или:

xargs --show-limits

Получим что-то типа:

….
Maximum length of command we could actually use: 2089314
….

Итак, давайте будем обходиться вовсе без wildcards.

Давайте просто напишем

cp -a /source /target

И тут мы столкнёмся с неоднозначностью поведения cp. Если папки /target не существует, то мы получим то, что нам нужно.

Однако, если папка target существует, то файлы будут скопированы в папку /target/source.

Не всегда мы можем удалить заранее папку /target, так как в ней могут быть нужные нам файлы и наша цель, допустим, дополнить файлы в /target файлами из /source.

Если бы папки источника и приёмника назывались одинаково, например, мы копировали бы из /source в /home/source, то можно было бы использовать команду:

cp -a /source /home

И после копирования файлы в /home/source оказались бы дополненными файлами из /source.

Такая вот логическая задачка: мы можем дополнить файлы в директории-приёмнике, если папки называются одинаково, но если они отличаются, то папка-исходник будет помещена внутрь приёмника. Как скопировать файлы из /source в /target с помощью cp без wildcards?

Чтобы обойти это вредное ограничение мы используем неочевидное решение:

cp -a /source/. /target

Те кто хорошо знаком с DOS и Linux уже всё поняли: внутри каждой папки есть 2 невидимые папки «.» и «..», являющиеся псевдопапками-ссылками на текущую и вышестоящие директории.

  • При копировании cp проверяет существование и пытается создать /target/.
  • Такая директория существует и это есть /target
  • Файлы из /source скопированы в /target корректно.

Итак, вешаем в жирную рамочку в своей памяти или на стене:

cp -a /source/. /target

Поведение этой команды однозначно. Всё отработает без ошибок вне зависимости от того миллион у вас файлов или их нет вовсе.

Выводы

Если нужно скопировать все файлы из одной папки в другую, не используем wildcards, вместо них лучше использовать cp в сочетании с точкой в конце папки-источника. Это скопирует все файлы, включая скрытые и не завалится при миллионах файлов или полном отсутствии файлов.

Послесловие

vmspike предложил аналогичный по результату вариант команды:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

ВНИМАНИЕ: регистр буквы T имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.


Благодарности:

  • Компании RUVDS.COM за поддержку и возможность публикации в своем блоге на Хабре.
  • За изображение TripletConcept. Картинка очень большая и детальная, можно открыть в отдельном окне.

P.S. Замеченные ошибки направляйте в личку. Повышаю за это карму.


Файловая система доступна только для чтения в Ubuntu

Давно не писал про Ubuntu — не было повода, но недавно он появился. Мне не удалось скопировать на флешку файлы, о чем система радостно сообщала — «Файловая система доступна только для чтения».

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

sudo fsck.vfat -a /dev/sdb1

Команду необходимо выполнить в терминале, вызвать который можно одновременным нажатием трёх клавиш — «Alt+Ctrl+T». Недоступность файловой системы была вызвана сбоем при копировании на флешку в прошлый раз. Возникли битые сектора, исправив которые, файловая система снова стала доступна для записи.

«sdb1» — идентификатор usb-накопителя в системе. Если у Вас два жестких диска, то он может отличаться от указанного. Выяснить его идентификатор можно командой:

fdisk -l | grep 'Disk /dev/sd'

Эта команда выведет список подключенных дисков.

Ответ на:

комментарий
от Extraterrestrial 08.05.14 15:53:21 MSK

Ответ на:

комментарий
от Extraterrestrial 08.05.14 15:53:21 MSK

Ошибка при получении информации о файле «/home/alex/Рабочий стол/Создать файл
»: Нет такого файла или каталога

Kofler

(08.05.14 16:06:14 MSK)

  • Показать ответы
  • Ссылка

Ответ на:

комментарий
от Kofler 08.05.14 16:06:14 MSK

Ответ на:

комментарий
от Kofler 08.05.14 15:53:58 MSK

Для тех кто в танке: система писала и о правах, что их не достаточно.

Kofler

(08.05.14 16:10:10 MSK)

  • Ссылка

Ответ на:

комментарий
от anonymous 08.05.14 16:11:44 MSK

Ответ на:

комментарий
от Kofler 08.05.14 16:22:14 MSK

Ответ на:

комментарий
от anonymous 08.05.14 16:26:06 MSK

Да, никого из «левых» :)
drwxr-xr-x 41 alex alex 4096 Май 8 17:03 alex

Kofler

(08.05.14 16:30:53 MSK)

  • Ссылка

Ответ на:

комментарий
от Kofler 08.05.14 16:06:14 MSK

Ответ на:

комментарий
от Kofler 08.05.14 16:06:14 MSK

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

w1nner ★★★★★

(08.05.14 20:04:07 MSK)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от w1nner 08.05.14 20:04:07 MSK

Ответ на:

комментарий
от Kofler 08.05.14 20:52:03 MSK

Не пробовал по нормальным невиндовским традициям сначалаоткрыть прогу, которая нужна, а оттуда сохранить? А по созданию на рабочем столе — нормальные люди на рабочем столе ничего никогда не держат.

DeadEye

★★★★★

(08.05.14 21:13:26 MSK)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от DeadEye 08.05.14 21:13:26 MSK

Нормальные ОСи работают в любом положении, хоть лежа хоть к верх ногами. Сохранять на рабочем столе файл концепция nix* запрещает?

Kofler

(08.05.14 21:41:51 MSK)

  • Ссылка

Ответ на:

комментарий
от TuxR 08.05.14 21:14:06 MSK

Да, место есть. Заметил одну особенность. Если сохранять файл через — Рабочий стол — Домашний каталог — то сохраняется. А если зайти через — Контроль свободного места на диске — то нет, пишет ошибку. Хотя всегда я сохранял (когда было нужно) через контроль* и все было ok а тут косяк получился. Что-то внезапно заглючило. Да, и еще, после последнего обновления системы, слете в грабе загрузчик винды.

Kofler

(08.05.14 21:45:44 MSK)

  • Ссылка

Юзай консоль.

zorg

★★

(08.05.14 23:13:48 MSK)

  • Ссылка

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.

Привет!
При копировании файла 4.7 Гб на USB флэшку (пустая объемом 8Гб) процесс прерывается на 4.1 Гб с ошибкой Невозможно скопировать файл в /var/media/lbv/A8B2-169B…. Подозреваю, что не хватает места на какой-то служебной ФС, используемой при копировании для временного хранения данных. Подскажите плз как побороть. Нужно разово скопировать. Перед копированием «корзину» очищал. Сейчас, после неудачного копирования распределение свободного пр-ва такое

[lbv@lbv ~]$ df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
udevfs             5,0M            0  5,0M            0% /dev
runfs              5,0M         2,2M  2,9M           43% /run
/dev/sda1          4,7G         546M  3,9G           13% /
tmpfs              3,9G        1008K  3,9G            1% /dev/shm
tmpfs              3,9G            0  3,9G            0% /sys/fs/cgroup
/dev/sda4          965M         929M     0          100% /var
runfs              5,0M         2,2M  2,9M           43% /var/run
runfs              5,0M         2,2M  2,9M           43% /var/lock
/dev/sda2          281M          21M  242M            8% /boot
/dev/sda6          334G          11G  306G            4% /usr
/dev/sda5          577G         155G  393G           29% /tmp
/dev/sdb1          7,5G         4,1G  3,5G           54% /run/media/lbv/A8B2-169B


Записан


А что за файловая система на флэшке?
Погуглите отганичения на размер файла для этой файловой системы.


Записан



Записан


Какая ФС не в курсе. Смонтирована так.

/dev/sdb1 on /run/media/lbv/A8B2-169B type vfat (rw,nosuid,nodev,relatime,uid=500,gid=500,fmask=0022,dmask=0077,codepage=866,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
/dev/sdb1 on /var/run/media/lbv/A8B2-169B type vfat (rw,nosuid,nodev,relatime,uid=500,gid=500,fmask=0022,dmask=0077,codepage=866,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro)
Копирование одинаково падает в AL и в Mint на другом компе. Только в Mint на 4.3Гб.

[lbv@lbv A8B2-169B]$ cp ~/Download/file.iso .
cp: ошибка записи «./file.iso»: Файл слишком велик
cp: не удалось расширить «./file.iso»: Файл слишком велик


Записан


Видимо да, проблема в vfat.


Записан


в частности на vfat — это ; 4 Gib -1 байт


Записан


/dev/sdb1 on /run/media/lbv/A8B2-169B type vfat (rw,nosuid,nodev,relatime,uid=500,gid=500,fmask=0022,dmask=0077,codepage=866,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)


Записан


Можно разрезать файл командой
split, а потом командой cat склеить. Или сжать архиватором (с включением многотомности).


Записан

Андрей Черепанов (cas@)


Отформатировал с ntfs. Скопировал файл успешно.
Спасибо!


Записан


  • Печать

Страницы: [1]   Вниз

Тема: Возникла проблема при копировании файлов на жесткий диск  (Прочитано 4740 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн
romagromov

Здравствуйте!
Во время установки появляется ошибка

Возникла проблема при копировании файлов на жесткий диск
[Errno 5] Input/outpur error.

Флешку создавал несколько раз с помощью Unetbootin и Etcher.
Пробовал дистрибутивы Ubuntu 17.10.1 и Ubuntu 16.04.4 LTS

C диском все в порядке!
Без проблем ставится Linux Mint и Fedora.


Оффлайн
snowin

romagromov, дык, проблемы с винчем, показывай смарт


Оффлайн
romagromov

Да нормальный диск.
Проверял смартом — все чисто. И флешка в порядке.

Fedora и Linux Mint с этой же флешки ставятся на ура. Никаких проблем. Проблема только с Ubuntu.
Может она с этим диском не дружит?
SSD — OCZ Agility 3


Оффлайн
snowin

romagromov, т.е. показывать смарт принципиально не будешь?


Оффлайн
romagromov

romagromov, т.е. показывать смарт принципиально не будешь?

Я просто рассчитываю, что мы здесь взрослые люди и верим друг другу на слово.
Плюс надо было разобрать тачку достать диск, вставить в другую тачку и еще раз сделать тест.

Ну и самое главное — другие дистрибутивы устанавливаются и работают.

Запрещается вставка полноразмерных изображений.

С уважением, Morisson

« Последнее редактирование: 21 Марта 2018, 15:37:15 от Morisson »


Оффлайн
snowin

romagromov, отдай эти красивые картинки детишкам и почувствуй ся взрослым
установи smartmontools
запусти

smartctl -t long /dev/sd?после окончания теста запусти

smartctl -a /dev/sd?вывод сюда, по спойлер

на картинке как минимум вижу одну странность
температура диска 72С, это действительно так???


Оффлайн
romagromov

1.

2.

Пардон, long тест будет завершен через 50 минут.

« Последнее редактирование: 21 Марта 2018, 12:02:16 от romagromov »


Оффлайн
snowin

запусти Код: [Выделить] smartctl -t long /dev/sd?

Extended self-test routine recommended polling time:     (  48) minutes.

Я просто рассчитываю, что мы здесь взрослые люди и верим друг другу на слово.


Оффлайн
romagromov

По ходу ему нужно было больше времени.

Вот результат:


Оффлайн
snowin

По ходу ему нужно было больше времени.

Extended self-test routine recommended polling time:     (  48) minutes.

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

sudo smartctl -d test /dev/disk6

smartctl --smart=on --offlineauto=on --saveauto=on /dev/disk6


Пользователь добавил сообщение 22 Марта 2018, 07:34:43:


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

« Последнее редактирование: 22 Марта 2018, 07:34:43 от snowin »


  • Печать

Страницы: [1]   Вверх

Понравилась статья? Поделить с друзьями:
  • Ошибка копирования контейнера в указанном состоянии
  • Ошибка копирования файл слишком велик для конечной файловой системы
  • Ошибка копирования контейнера 0x8009000b нет разрешений
  • Ошибка концевой выключатель двери водителя шкода октавия а7
  • Ошибка копирования устройство назначения доступно только для чтения