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

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




Основные способы копирования файлов

МетодКоманда-примерПреимуществаОграничения
Простое копированиеcp *.jpg папка/— Простота использования
— Быстрота для малого числа файлов
— Не работает рекурсивно
— Не поддерживает пробелы в именах
Рекурсивное копирование всех файловcp -r исходная/ папка/— Копирует всю структуру каталогов
— Простой синтаксис
— Копирует все файлы без фильтрации по расширению
find + execfind . -name '*.jpg' -exec cp {} папка/ \;— Точечный выбор по расширению
— Поддержка сложных условий поиска
— Медленнее для тысяч файлов
— Сложный синтаксис
find + xargsfind . -name '*.jpg' | xargs cp -t папка/— Быстрее для большого числа файлов
— Проще читается
— Проблемы с файлами, содержащими пробелы
find + xargs с -print0find . -name '*.jpg' -print0 | xargs -0 cp -t папка/— Безопасная обработка любых имен
— Идеально для production-сред
— Самый сложный синтаксис
— Избыточен для простых задач
Таблица 1: Сравнение методов копирования файлов по расширению в Linux

Простое копирование с помощью cp

Базовый синтаксис команды cp:

Bash
cp файл1 файл2 целевая_папка/

Для копирования по расширению используйте символы подстановки:

Bash
cp *.jpg *.png изображения/

Ограничение: этот метод не работает рекурсивно для подкаталогов.

Рекурсивное копирование всех файлов

Для копирования всей структуры папок используйте флаг -r:

Bash
cp -r исходная_папка/ целевая_папка/

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


Решение: комбинация find и cp

Для рекурсивного копирования только файлов с определённым расширением используйте:

Bash
find исходная_папка -name '*.jpg' -exec cp {} целевая_папка/ \;

Где:

  • исходная_папка — где искать файлы
  • '*.jpg' — шаблон расширения
  • целевая_папка — куда копировать

Альтернативный вариант с xargs:

Bash
find исходная_папка -name '*.jpg' | xargs cp -t целевая_папка/

Полезные модификации

  1. Копировать несколько расширений:
Bash
find . \( -name '*.jpg' -o -name '*.png' \) -exec cp {} целевая_папка/ \;
  1. Создать целевую папку, если её нет:
Bash
mkdir -p целевая_папка && find . -name '*.jpg' -exec cp {} целевая_папка/ \;
  1. Сохранить структуру подкаталогов:
Bash
find . -name '*.jpg' -exec cp --parents {} целевая_папка/ \;

Обработка большого количества файлов

Для тысяч файлов лучше использовать:

Bash
find . -name '*.jpg' -print0 | xargs -0 cp -t целевая_папка/

Опция -print0 и -0 корректно обрабатывают файлы с пробелами в именах.


Заключение

Логика выбора между cp, find -exec, xargs и rsync для копирования файлов в Linux

Теперь вы знаете несколько способов рекурсивного копирования файлов по расширению:

  • Простое копирование cp для текущего каталога
  • Комбинация find и cp для рекурсивного поиска
  • Методы для обработки тысяч файлов
  • Варианты с сохранением структуры каталогов

Дополнительные советы:

  • Всегда проверяйте наличие целевой папки перед копированием
  • Для очень большого количества файлов рассмотрите rsync
  • Используйте -v для вывода информации о процессе копирования

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


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

Was this helpful?

0 / 0

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