rsync は、ターゲットフォルダに同じ名前のディレクトリを作成します。

rsync は、ターゲットフォルダに同じ名前のディレクトリを作成します。

11.*と14.*(サブフォルダを含む)で始まり、1日以内のフォルダにある.binファイルのみrsyncしようとしています。

私が今まで試したこと:

rsync -Rarv `find /mnt/IP/ftp/123/ -type f -mtime -1` --prune-empty-dirs --include "1[1][4]./" --include="*.bin" --exclude="*" "/mnt/IP/ftp/123/" "/home/ftp/123/"

通常は動作しますが、Rsyncはターゲット内に同じ名前のディレクトリを作成します:/home/ftp/123/mnt/IP/ftp/123/

そのため、11.*または14.*で始まるフォルダのみを再生成するソリューションを探しています。

答え1

この回答は「1日以内」の制限を考慮しません。

努力する代わりに出力の解析findrsync直接使用~から find:

find /mnt/IP/ftp/123 -type -name '1[14].*' -prune \
    -exec rsync -av \
        --include='*.bin' --include='*/' \
        --exclude='*' --prune-empty-dirs {} /home/ftp/123 ';'

11.名前がin14.またはunderで始まるディレクトリを探します/mnt/IP/ftp/123。これらの各ディレクトリについて、検索リストからディレクトリを削除して(を使用して-prune)、次の手順を実行します。

rsync -av --include='*.bin' --include='*/' \
    --exclude='*' --prune-empty-dirs {} /home/ftp/123 

ここでは、{}見つかったディレクトリのパス名に置き換えられます。

このrsyncコマンドは、/home/ftp/123見つかったディレクトリと同じファイル名(11.またはで始まる14.など)のサブディレクトリを作成し、ファイルをコピーし.binます。

使用される包含および除外パターンrsync(最初の一致の勝利):

  • --include='*.bin':ファイル名が.で終わるすべてのファイルを含みます.bin
  • --include='*/':すべてのディレクトリを含みます。これにより、ターゲットの空のディレクトリが失われます--prune-empty-dirs
  • --exclude='*': 前のルールに含まれていない項目を除外します。

答え2

これを使用して、find3つの条件を満たすファイルセットを構築できます。

  • 一日もできない
  • 11.*一致するディレクトリになければなりません。14.*
  • ファイルの一致*.bin

その後、このリストが提供され処理rsyncされます。

find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
    rsync -av --files-from - --from0 --prune-empty-dirs / dst/    

私は名前に予期しない文字を含むファイルが正しく処理されるようにするために-print0およびを使用しました。-from0パス/./内の追加のエントリは、そのコンポーネントの前のすべてのエントリがターゲットパスから削除されることをfind意味します。 (相対パス(例:で始まらないパス)rsyncを使用することにした場合は、ソースをからに変更してください。)find/rsync/.


例のシナリオ

# All files in the example
find /mnt/IP/ftp/123/./ -type f
/mnt/IP/ftp/123/./11.one/7.skip/skip.bin
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./12.skip/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./item.bin
/mnt/IP/ftp/123/./sub/13.skip/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin
/mnt/IP/ftp/123/./sub/14.next/skip.this
/mnt/IP/ftp/123/./sub/item.bin

# Files matched by "find"
find mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print
/mnt/IP/ftp/123/./11.one/item.bin
/mnt/IP/ftp/123/./14.one/item.bin
/mnt/IP/ftp/123/./sub/14.next/item.bin

# Files copied by "rsync"
find /mnt/IP/ftp/123/./ -mtime -1 \( -path '*/1[14].*/*' -prune \) -name '*.bin' -print0 |
    rsync -av --files-from - --from0 --prune-empty-dirs / dst/
building file list ... done
11.one/
11.one/item.bin
14.one/
14.one/item.bin
sub/
sub/14.next/
sub/14.next/item.bin

関連情報