Поиск по сайту:

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

Некоторое время назад мы узнали, как копировать файлы определенного типа из одного каталога в другой в Linux. Сегодня мы собираемся сделать то же самое, но сохраним структуру каталогов. В этом кратком руководстве объясняется, как копировать файлы определенных типов, сохраняя структуру каталогов в Linux. Здесь я дал два разных способа сделать это. Просто выберите любой, который подойдет именно вам.

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

Представьте себе этот сценарий.

У меня есть каталог с именем "Linux", в разных подкаталогах которого сохранены файлы разных типов. Взгляните на следующую структуру каталогов:

$ tree Linux/
Linux/
├── dir1
│   ├── English
│   │   └── Kina - Can We Kiss Forever.mp3
│   ├── Instrumental
│   │   └── Chill Study Beats.mp3
│   └── Tamil
│       ├── Kannan Vanthu.mp3
│       └── yarenna.mp3
├── dir2
│   ├── file.docx
│   └── Raja Raja Chozan Naan.mp3
├── dir3
│   ├── Bamboo Flute - Meditation - Healing - Sleep - Zen.mp3
│   └── pic.jpg
└── dir4
    ├── Aaruyirae.mp3
    └── video.mp4

7 directories, 10 files

Просмотр содержимого каталога с помощью команды дерева

Как видно из приведенной выше структуры каталогов, каталог Linux имеет четыре подкаталога, а именно: dir1, dir2, dir3. > и каталог4. Файлы mp3 разбросаны по всем четырем подкаталогам. Теперь я хочу скопировать все файлы mp3 в другой каталог с именем "ostechnix", а также сохранить ту же структуру каталогов в целевом каталоге.

Сначала мы увидим, как это сделать с помощью команды «найти».

Способ 1 — с помощью команд «find» и «cp» или «cpio».

Перейдите в исходный каталог:

cd Linux/

И скопируйте все типы файлов mp3 с помощью команды «найти»:

find . -name '*.mp3' -exec cp --parents \{\} ~/ostechnix \;

Давайте разберем приведенную выше команду и посмотрим, что делает каждая опция.

  • find – команда для поиска файлов и папок в Unix-подобных системах.
  • точка (.) — означает, что мы копируем содержимое из текущего каталога.
  • -iname ‘*.mp3’ – поиск файлов с расширением .mp3.
  • -exec cp – выполните команду «cp», чтобы скопировать файлы из исходного каталога в целевой.
  • --parents — создайте промежуточные родительские каталоги, если необходимо сохранить структуру родительских каталогов.
  • \{\ – автоматически заменяется именем файлов, найденных командой «найти». А фигурные скобки экранируются , чтобы защитить их от расширения оболочкой в некоторых версиях команды "найти". Вы также можете использовать {} без escape-символов.
  • ~/ostechnix – целевой каталог для сохранения соответствующих файлов.
  • \; – указывает, что команды, которые необходимо выполнить, теперь завершены и необходимо выполнить команду еще раз при следующем совпадении.

Эта команда найдет и скопирует все файлы типа mp3 из каталога ~/Linux в каталог ~/ostechnix. А также он сохраняет ту же структуру каталогов в целевом каталоге.

Вы можете проверить это, используя команду «дерево» в обоих местах, как показано ниже.

Просмотр содержимого каталога с помощью команды дерева в Linux

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

Если вы делаете это из другого места, укажите полный путь к исходному каталогу, как показано ниже.

find ~/Linux -name '*.mp3' -exec cp --parents \{\} ~/ostechnix \;

Эта команда найдет все файлы в папке Linux/<подкаталоги> и скопирует их в ostechnix/~/Linux/<подкаталоги>.

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

Если опция --parents не работает, вы можете объединить команду find с командой cpio для копирования файлов с сохранением структуры каталогов.

find . -name '*.mp3' | cpio -pdm  ~/ostechnix

Здесь,

  • cpio — команда для копирования файлов в архивы и из них.
  • -p — прочитать список имен файлов из стандартного ввода и скопировать их в указанный каталог.
  • -d — создать каталоги там, где это необходимо.
  • -m — сохранить время изменения файла.

Более подробную информацию можно найти на страницах руководства.

man find
man cp
man cpio

Рекомендуем прочитать:

  • Как автоматически упорядочивать файлы одного типа в определенных папках

Способ 2 – использование Rsync

Rsync – мощный инструмент, используемый для обмена данными с локальными и удаленными системами. Чтобы скопировать файлы определенного типа из одного каталога в другой, сохраняя структуру родительского каталога, выполните:

rsync -a -m --include '*/' --include '*.mp3' --exclude '*' ~/Linux/ ~/ostechnix

Или,

rsync -a --prune-empty-dirs --include '*/' --include '*.mp3' --exclude '*' ~/Linux/ ~/ostechnix

Здесь,

  • rsync — инструмент удаленного (и локального) копирования файлов.
  • -a — режим архивирования для сохранения практически всего (включая символические ссылки, даты изменения, права доступа к файлам, владельцев и т. д.)
  • -m, --prune-empty-dirs — удалить пустые каталоги из дерева исходного кода. Если вы хотите включить пустые каталоги, просто удалите эту опцию из приведенной выше команды.
  • --include="*/" --include="*.mp3" --exclude="*" – чтобы включить только определенные файлы, сначала необходимо включить эти конкретные файлы, а затем исключить все другие файлы. В нашем случае мы включили файлы *.mp3 и исключили все остальное.
  • ~/Linux — исходный каталог.
  • ~/ostechnix — каталог назначения.

Пример вывода:

Копирование определенных типов файлов с сохранением структуры каталогов с помощью Rsync в Linux

Более подробную информацию можно найти на страницах руководства.

man rsync

Надеюсь это поможет.

Статьи по данной тематике