Копирование определенных типов файлов с сохранением структуры каталогов в 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. А также он сохраняет ту же структуру каталогов в целевом каталоге.
Вы можете проверить это, используя команду «дерево» в обоих местах, как показано ниже.
Как вы видите в приведенном выше выводе, каталог назначения содержит только файлы mp3, а его структура каталогов такая же, как и исходный каталог.
Если вы делаете это из другого места, укажите полный путь к исходному каталогу, как показано ниже.
find ~/Linux -name '*.mp3' -exec cp --parents \{\} ~/ostechnix \;
Эта команда найдет все файлы в папке Linux/<подкаталоги> и скопирует их в ostechnix/~/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 — каталог назначения.
Пример вывода:
Более подробную информацию можно найти на страницах руководства.
man rsync
Надеюсь это поможет.