ディレクトリのリストとそのディレクトリを含むテキストファイルがあります。絶対パス
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
rsyncを使用してこれらのすべてのディレクトリを別の場所にコピーし、絶対パスを維持したいと思います。
次のrsyncコマンドを試しましたが機能しません
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
ここで何の問題がありますか?
答え1
rsync [リストから]を使用してこれらのすべてのディレクトリをコピーし、絶対パスを別の場所に維持したいと思います。
--include
または--filter
、バリアントを使用すると状況が混乱するだけなので、使用しないでください。代わりに--files-from=_filename_
。場所テスト。 )
1行に1つのディレクトリ/ファイルごとにファイルにディレクトリリストを作成します。
--files-from=
上記のファイルでrsyncを使用してください。ソースパス名をターゲットの末尾にコピーするには、
--relative
/オプションを使用します。-R
-a
オプションがあっても-r
マニュアルページに含めてください。どちらの場合も、-rオプションが有効になると、そのディレクトリの階層全体も送信されます(-aは-rを意味しないため、-rは--files-fromを使用して明示的に指定する必要があることに注意してください)。 。
完全なコマンド:
rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir> <target-dir>
(ファイル位置ファイルリスト.txt親戚であるか、次に発見する必要があります。トップレベルディレクトリ)
(DEBUGが設定されている場合、rsyncはコピーされたコンテンツのみを印刷します。)
答え2
次のコマンドを使用します。
rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/
/data/ を明示的に含めるか、ファイルのリストに追加できます。次に、他のすべてのディレクトリを除外します(インクルード/除外、順序の問題)。
-r
はに含まれているため、使用は重複します-a
。
編集:以下を使用して同じ結果を得ることもできます。
rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/
rsyncは、いくつかのディレクトリをコピーするのが難しいことを強制するのではなく、同じことをするいくつかの方法を提供するだけです。場合によっては、包含/除外アプローチがより適切な場合があります。ここでは、次のようにします。 -上記の相対操作(--relative
終了せず、完全な/media/MyDestination/Dir1
ソースパスがターゲットにコピーされた場合)。/media/MyDestination/Dir2
--relative
答え3
これrsync マニュアルこの状況について警告します(「パターンルールを含める/除外する」セクション)。
これはうまくいきません:
+ /some/path/this-file-will-not-be-found + /file-is-included - *
親ディレクトリは
"some"
ルールによって除外されるため、rsync は'*'
ディレクトリ内のファイルやファイルにアクセスしないため失敗します。 1つの解決策は、階層内のすべてのディレクトリを含む単一の規則を必要とし(規則の前に配置)、そのオプションを使用することです。別の解決策は、アクセスが必要なすべての親ディレクトリに特定のインクルードルールを追加することです。たとえば、次のルールセットは正しく機能します。"some"
"some/path"
"+ */"
"- *"
--prune-empty-dirs
+ /some/ + /some/path/ + /some/path/this-file-is-found + /file-also-included - *
あなたの場合、最も簡単な方法は、含めるディレクトリのリストを前処理して、を含めるたびにすべての親ディレクトリ/path/to/foo
(、、/path/to
)を含め、元のディレクトリ()のサブディレクトリ()も含めることです。それ以降は、以前にリストされていなかったすべてを除外する規則があります()。/path
/
/path/to/foo/***
*
<DirectoriesToCopy.txt awk '
{print "+ " $0 "/***"; while (sub(/\/+[^\/]+\/*$/, "/")) print "+ " $0}
END {print "- *"}
' >rsync-rules.txt
rsync -avr --include-from=rsync-rules.txt / /media/MyDestination/