Время на прочтение
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 — не было повода, но недавно он появился. Мне не удалось скопировать на флешку файлы, о чем система радостно сообщала — «Файловая система доступна только для чтения».
Попытка выставить нужные права на файлы и каталоги не дала результатов и я пошел искать решение в интернете. Проблема оказалась распространенной и не раз обсуждалась. Несмотря на это, нужную команду я нашел не сразу.
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
Не пробовал по нормальным невиндовским традициям сначалаоткрыть прогу, которая нужна, а оттуда сохранить? А по созданию на рабочем столе — нормальные люди на рабочем столе ничего никогда не держат.
★★★★★
(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)
- Ссылка
Юзай консоль.
★★
(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)
Копирование одинаково падает в AL и в Mint на другом компе. Только в Mint на 4.3Гб.
/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)
[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] Вверх