rsync 递归所有文件-排除所有文件夹(但不排除其内容)

rsync 递归所有文件-排除所有文件夹(但不排除其内容)

我有一个名为的文件夹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

我建议首先构建一个暂存的、本地的、平面的目录,只用符号链接(如果它在同一个文件系统中,你甚至可以用硬链接填充它)填充到实际的文件,然后 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会抱怨),但这超出了问题的范围。

相关内容