特定のサブフォルダとファイルを新しいディレクトリにコピーする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など多くのフォルダがありますが、フォルダ内の構造は常に同じです(ファイル以外は異なります)


コピー先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="/*/*/" : FolderA/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

本当に を使用したい場合はrsynccp行を次のように置き換えます。これにより、ディレクトリの変更時刻を取得できます。

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

関連情報