Rsync 将特定子文件夹和文件复制到新目录

Rsync 将特定子文件夹和文件复制到新目录

原始路径,RootFolderI:

RootFolderI/FolderA/Subfolder1/Subsub1/JPG1.jpg -> want this jpg
RootFolderI/FolderA/Subfolder2/Subsub1/JPG2.jpg -> want this jpg
RootFolderI/FolderA/Subfolder2/Subsub2/JPG3.jpg
. . .
RootFolderI/FolderB/Subfolder1/Subsub1/JPG4.jpg -> want this jpg
RootFolderI/FolderB/Subfolder2/Subsub1/JPG5.jpg -> want this jpg
RootFolderI/FolderB/Subfolder3/Subsub2/JPG6.jpg
...

有很多文件夹FolderA/B/C/etc,但里面的文件夹结构总是一样的(除了文件不同)


我想复制到RootFolderII

  • 仅所有文件夹A/B/等
  • Subsub1 中的所有文件

...结果是这条新路径,RootFolderII:

RootFolderII/FolderA/ with JPG1.jpg, JPG2.jpg
RootFolderII/FolderB/ with JPG4.jpg,JPG5.jpg

我现在有以下代码(但它不起作用):

rsync -r --include='Folder*/Subfolder1/Subsub1/***' --exclude="/*/*/" /RootFolderI/ /RootFolderII/

在哪里

--exclude="/*/*/" :创建文件夹A/B/... -> 工作

--include='Folder*/Subfolder1/Subsub1/***' :我想复制所有文件(不是结构)... -> 它不起作用

???好吧,我认为即使它正常工作,它也会将文件从FolderB复制到FolderA,而我不希望这样!

答案1

试一试。

rsync -r --include='*.jpg' --exclude="*" /RootFolderI/Folder*/Subfolder1/Subsub1/. /RootFolderII/.

答案2

我做了什么:

  • rsync包含和排除

  • 将文件上移(向上 2 级)

    find /folder/ -type f -mindepth 3 -execdir mv -t ../../ -- {} +
    
  • 删除空文件夹

    find /folder/*/ -type d -empty -delete
    

答案3

我认为我不会用于rsync这项任务。 (没有增量算法,因此使用它几乎没有什么收获。)这是一个使用的版本cp

for rfipath in RootFolderI/*
do
    folder="${rfipath/*\/}"
    mkdir -p "RootFolderII/$folder"
    cp -p "$rfipath"/*/Subsub1/* "RootFolderII/$folder"
done

输出

RootFolderII/FolderA/JPG1.jpg
RootFolderII/FolderA/JPG2.jpg
RootFolderII/FolderB/JPG4.jpg
RootFolderII/FolderB/JPG5.jpg

如果您确实想使用rsync,请cp用此替换该行。它将为您提供目录的修改时间:

for folder in RootFolderI/*
do
    rsync -a "$folder"/*/Subsub1/ "RootFolderII/${folder/*\/}"
done

相关内容