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

相關內容