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

Как вы, возможно, уже знаете, cp – это программа командной строки в Linux для копирования файлов и каталогов. Простой и наиболее распространенный способ использования cp:

cp file1 file2 file3... fileN target_folder/

Обратите внимание, что приведенная выше команда работает как для файлов, так и для пустых каталогов. Она не будет работать для директорий, в которых есть содержимое – файлы или вложенные каьалоги.

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

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

cp -r folder1/ folder2/ file1 file2 target_folder/

При этом копируются все файлы, и в команде cp нет возможности исключить некоторые из них по определенным параметрам.

Например, пользователь может захотеть рекурсивно скопировать все файлы, кроме MP3 (аудио).

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

Для этого используется команда find, которая представляет собой командный инструмент для поиска файлов и папок в Linux на основе параметров файла или папки: имени файла, расширения, размера и т.д.

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

find <folder_to_search> -name *.<extension>

Например, чтобы рекурсивно найти все MP3-файлы в текущей папке:

find . -name *.mp3

Теперь, чтобы найти все файлы в папках и подпапках, кроме MP3-файлов, используйте оператор отрицания команды find:

find . ! -name *.mp3

Мы видим, что теперь отображается все, кроме MP3-файлов. Однако мы хотим отобразить только файлы, поскольку этот вывод впоследствии будет введен в cp. Сейчас же на экран выводятся и файлы, и папки (например, temp1/), что приведет к повторному копированию одних и тех же файлов.

Чтобы убрать папки из вывода, достаточно использовать аргумент -type f. Здесь f означает файл.

find . ! -name *.mp3 -type f

Таким образом, мы имеем только файлы, полученные рекурсивно в папке test. Теперь мы можем передать этот вывод команде cp.

Исключение расширений файлов при рекурсивном копировании

Для этого мы используем команду xargs, чтобы заставить команду cp рассматривать вывод команды find в качестве аргументов. Также мы используем флаг -t для указания целевого каталога, без которого программа рассматривает вывод find как целевой каталог.

find <folder_to_search> ! -name '*.<extension>' -type f | xargs cp -t <target_directory>

Актуальная команда.

find . ! -name '*.mp3' -type f | xargs cp -t Misc/

Таким образом, все найденные рекурсивно файлы, кроме .mp3, будут скопированы в папку Misc.

Вывод

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

Если у вас возникли вопросы или замечания, сообщите нам об этом в комментариях ниже.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен www.ubuntumint.com

Похожие статьи

Комментарии (0)