Как вы, возможно, уже знаете, 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, исключая файлы определенного расширения. Также рассмотрим, как рекурсивно копировать файлы определенного расширения.
Если у вас возникли вопросы или замечания, сообщите нам об этом в комментариях ниже.
Комментарии (0)