Копирование файлов по их расширению — частая задача при работе с файловой системой 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: подробное руководство
Было ли это полезно?
0 / 0