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

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

find исходная_папка -name '*.jpg' | xargs cp -t целевая_папка/
Полезные модификации
- Копировать несколько расширений:
find . \( -name '*.jpg' -o -name '*.png' \) -exec cp {} целевая_папка/ \;
- Создать целевую папку, если её нет:
mkdir -p целевая_папка && find . -name '*.jpg' -exec cp {} целевая_папка/ \;
- Сохранить структуру подкаталогов:
find . -name '*.jpg' -exec cp --parents {} целевая_папка/ \;
Обработка большого количества файлов
Для тысяч файлов лучше использовать:
find . -name '*.jpg' -print0 | xargs -0 cp -t целевая_папка/
Опция -print0
и -0
корректно обрабатывают файлы с пробелами в именах.
Заключение

Теперь вы знаете несколько способов рекурсивного копирования файлов по расширению:
- Простое копирование
cp
для текущего каталога - Комбинация
find
иcp
для рекурсивного поиска - Методы для обработки тысяч файлов
- Варианты с сохранением структуры каталогов
Дополнительные советы:
- Всегда проверяйте наличие целевой папки перед копированием
- Для очень большого количества файлов рассмотрите
rsync
- Используйте
-v
для вывода информации о процессе копирования
Если у вас есть вопросы или интересные случаи из практики — делитесь в комментариях!
Дополнительные материалы:
- Команда cp для копирования файлов в Linux
- Как копировать большое количество файлов в Linux
- Команда find в Linux: полное руководство по поиску файлов
- Как исключить папку при поиске файлов в Linux: подробное руководство
Was this helpful?
0 / 0