У меня есть папка с files которая содержит много подпапок.

В этой подпапке есть видеофайлы или другая папка с видеофайлами.

Итак, древовидная структура выглядит примерно так:

subfolder/video.mp4
subfolder2/video1.mp4
subfolder2/anothersubfolder/video2.mp4

Теперь я хочу скопировать все видеофайлы с помощью rsync в мою папку vids , только видеофайлы. Я не могу понять, как это сделать.

Вот что я попробовал:

rsync -avztr --delete /home/pi/ftp/data/files/ /home/pi/vids/ --include=*.mp4 --include=*.m4v --exclude=*/

Может ли кто-нибудь указать мне правильное направление?

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

1 ответ1

2

Я предлагаю сначала создать промежуточные, локальные, плоские, каталоги, заполненные только символическими ссылками (вы можете даже заполнить их жесткими ссылками, если они находятся в той же файловой системе) с фактическими файлами, а затем rsync вместо "оригинала", используя параметр - L для передачи фактического файла, а не символическая ссылка.

#!/bin/sh

rm -rf /home/pi/staging
mkdir /home/pi/staging
find /home/pi/ftp/data/files -type f '(' -name '*.mp4' -o -name '*.m4v' ')' -print0 | xargs -0r ln -s -t /home/pi/staging
# rsync -a = rsync -rlptgoD but -L is needed instead of -l. Perhaps -aL has the same effect as -rLptgoD
rsync -rLptgoDvztr --delete /home/pi/staging/ /home/pi/vids/ --include='*.mp4' --include='*.m4v'

Кстати, это не сработает в случае коллизии с несколькими файлами в разных подкаталогах с одинаковыми именами (здесь будет жаловаться ln -s ), но это выходит за рамки вопроса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .