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/etc
  • все файлы в 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/***' : я хочу скопировать все файлы (не структуру) ... -> это не работает

???ну, я думаю, что даже если бы это работало, оно бы копировало файлы из папки Б в папку А, а мне это не нужно!

решение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

Связанный контент