2

大きなディレクトリ構造内のすべてのファイルを単一のルート ディレクトリに同期しようとしています (つまり、サブ ディレクトリを作成せずに、すべての再帰ファイルを含めます)。

環境:

  • Ubuntu 12.04 x86
  • RSYNC バージョン 3.0.9
  • GNU bash バージョン 4.2.25(1)

これまでのところ、正常に動作し、必要な基本的なコア機能を提供する bash スクリプトからこのコマンドを呼び出しました。

shopt -s globstar
rsync -adv /path/to/source/**/. /path/to/dest/. --exclude-from=/myexcludefile

の内容は次のmyexcludefileとおりです。

filename
*/ 
# the */ prevents all of the directories appearing in /path/to/dest/

# other failed attempts have included:
directory1
directory1/
directory1/*

ソース ツリーの特定のディレクトリ内にあるファイルを除外する必要があります。ただし、すべてのディレクトリを検索する globstar アプローチにより、rsync は除外するディレクトリを一致させることができません。/*つまり、 myとrulesを除いて、他のfilenameすべては完全に無視されます。

したがって、excludes 構文について、または globstar アプローチを使用しない単一の宛先ディレクトリへの多くのディレクトリの rsync を実現する別の方法があるかどうかについて、いくつかの支援を探しています。

ヘルプやアドバイスをいただければ幸いです。

4

1 に答える 1

1

ディレクトリを globstar の一致から除外したい場合は、それらを配列に保存してから、ファイルに基づいてその配列の内容をフィルタリングできます。

例:

#!/bin/bash

shopt -s globstar

declare -A X
readarray -t XLIST < exclude_file.txt
for A in "${XLIST[@]}"; do
    X[$A]=.
done

DIRS=(/path/to/source/**/.)
for I in "${!DIRS[@]}"; do
    D=${DIRS[I]}
    [[ -n ${X[$D]} ]] && unset 'DIRS[I]'
done

rsync -adv "${DIRS[@]}" /path/to/dest/.

実行:

bash script.sh

exclude_file.txt の値は、展開された .txt の値と実際に一致する必要があることに注意してください/path/to/source/**/.

于 2013-09-19T17:43:21.677 に答える