Как копировать большое количество файлов в Linux

Копирование файлов и директорий в Linux — одна из самых распространенных задач, с которой сталкиваются пользователи. Обычно для этого используется команда cp, которая позволяет копировать как отдельные файлы, так и целые директории. Однако при работе с большим количеством файлов могут возникнуть сложности, такие как ошибка «Argument list too long». В этой статье мы рассмотрим, как эффективно копировать большое количество файлов в Linux и обойти возможные ограничения.




Использование команды cp

Команда cp в Linux используется для копирования файлов и директорий. Её базовый синтаксис выглядит следующим образом:

Bash
cp <файл1> <файл2> ... <файлN> <целевая_директория>

Для копирования директорий и их содержимого используется флаг -r (рекурсивное копирование):

Bash
cp -r <директория1> <директория2> ... <директорияN> <целевая_директория>

Пример копирования нескольких файлов:

Bash
cp file1 file2 file3 /tmp

Если файлы имеют схожие имена или расширения, можно использовать символы подстановки (wildcards), например:

Bash
cp *.txt /tmp
cp file_* /tmp

Проблема: «Argument list too long»

При попытке скопировать очень большое количество файлов (например, более 100 000) с использованием символов подстановки, вы можете столкнуться с ошибкой:

Bash
bash: /usr/bin/cp: Argument list too long

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


Решение: Использование команды find

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

Bash
find . -maxdepth 1 -name "file_*" -exec cp {} целевая_директория/ \;

Здесь:

  • . — текущая директория, в которой выполняется поиск.
  • -maxdepth 1 — ограничивает поиск только текущей директорией (без вложенных).
  • -name "file_*" — задаёт шаблон имени файлов.
  • -exec cp {} целевая_директория/ \; — выполняет команду cp для каждого найденного файла.

Пример:

Bash
find . -maxdepth 1 -name "file_*" -exec cp {} /target/ \;

После выполнения команды все файлы будут скопированы в целевую директорию.


Копирование директорий

Если нужно скопировать не только файлы, но и директории, добавьте флаг -r к команде cp:

Bash
find . -maxdepth 1 -name "file_*" -exec cp -r {} /target/ \;

Проверка результата

После завершения копирования можно проверить, успешно ли скопировались файлы:

Bash
cd /target/
ls | head -10  # Показать первые 10 файлов
ls -l | wc -l  # Подсчитать количество файлов

Заключение

Копирование большого количества файлов в Linux может быть выполнено с помощью команды cp, но при работе с огромным количеством данных лучше использовать комбинацию find и cp, чтобы избежать ошибки «Argument list too long». Этот метод обеспечивает гибкость и надёжность при обработке большого объёма файлов.

Если у вас есть вопросы или замечания, оставляйте их в комментариях!


Дополнительные материалы.

Было ли это полезно?

2 / 0

Добавить комментарий 0