web-dev-qa-db-ja.com

特定のファイルのリストのみをrsyncする方法は?

リモートサーバーにプッシュしたいさまざまなサブディレクトリに約50個ほどのファイルがあります。 rsyncは--include-fromオプションを使用してこれを行うことができると考えました。 --exclude = "*"オプションを使用しない場合、ディレクトリ内のすべてのファイルが同期されますが、オプションを使用するとファイルは同期されません。

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ root@0.0.0.0:/var/www/ --dry-run

最初はドライとして実行していますが、0.0.0.0は明らかにリモートサーバーのIPに置き換えられています。 rsync_include.txtの内容は、アップロードするファイルへの相対パスの改行で区切られたリストです。

月曜日の朝に私を逃がすこれを行うより良い方法はありますか?

65
Dan Steele

特定のファイルのリストを探している場合は、コマンドラインに直接入力する方が簡単です。

# rsync -avP -e ssh `cat deploy/rsync_include.txt` root@0.0.0.0:/var/www/

ただし、これは、リストがコマンドラインの長さが問題になるほど長くなく、rsync_include.txtファイルに実際のパスのみが含まれている(つまり、コメントも正規表現もない)と仮定しています。

1
Wes Hardaker

--files-fromというフラグがあり、これはまさにあなたが望むことをします。 man rsyncから:

--files-from=FILE

このオプションを使用すると、転送するファイルの正確なリストを指定できます(指定されたFILEから読み取るか、標準入力の場合は-)。また、rsyncのデフォルトの動作を微調整して、指定したファイルとディレクトリだけを簡単に転送できるようにします。

  • --relative(-R)オプションが暗黙的に指定され、ファイル内の各項目に指定されたパス情報が保持されます(オフにする場合は--no-relativeまたは--no-Rを使用します)。

  • --dirs(-d)オプションが暗黙的に指定されます。これは、それらを騒々しくスキップするのではなく、宛先のリストで指定されたディレクトリを作成します(オフにするには--no-dirsまたは--no-dを使用します)。

  • --archive(-a)オプションの動作は--recursive(-r)を意味しないため、必要に応じて明示的に指定してください。

  • これらの副作用はrsyncのデフォルト状態を変更するため、コマンドラインの--files-fromオプションの位置は、他のオプションの解析方法に影響しません(たとえば、-aは--files-の前後で同じように機能します) from --no-Rおよび他のすべてのオプションと同様)。

FILEから読み取られるファイル名はすべてソースディレクトリに関連しています。先頭のスラッシュはすべて削除され、「..」参照はソースディレクトリより高くなることはできません。たとえば、次のコマンドを使用します。

rsync -a --files-from=/tmp/foo /usr remote:/backup

/ tmp/fooに文字列「bin」(または「/ bin」)が含まれている場合、/ usr/binディレクトリはリモートホスト上に/ backup/binとして作成されます。 「bin /」(末尾のスラッシュに注意)が含まれている場合、ディレクトリの直接の内容も送信されます(ファイルで明示的に言及する必要なしに-これはバージョン2.6.4で始まりました)。どちらの場合も、-rオプションが有効になっている場合、そのディレクトリの階層全体も転送されます(-aによって暗黙指定されないため、-files-fromで明示的に指定する必要があることに注意してください)。また、(デフォルトで有効になっている)--relativeオプションの効果は、ファイルから読み取られたパス情報のみを複製することです-source-specパス(この場合は/ usr)の複製を強制しません。

さらに、ファイルの前に「Host:」を指定すると、ローカルホストではなくリモートホストから--files-fromファイルを読み取ることができます(ホストは転送の一端と一致する必要があります)。ショートカットとして、「転送」のリモートエンドを使用することを意味する「:」のプレフィックスのみを指定できます。例えば:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy

これにより、リモートの「src」ホストにある/ path/file-listファイルで指定されたすべてのファイルがコピーされます。

--iconvおよび--protect-argsオプションが指定され、-files-fromファイル名が1つのホストから別のホストに送信される場合、ファイル名は送信ホストの文字セットから受信ホストの文字セットに変換されます。

注:--files-from入力でファイルのリストを並べ替えると、rsyncがより効率的になり、隣接するエントリ間で共有されているパス要素に再度アクセスする必要がなくなります。入力がソートされていない場合、一部のパス要素(暗黙のディレクトリ)が複数回スキャンされる可能性があり、rsyncはファイルリスト要素になった後、最終的にそれらの重複を取り除きます。

168
atp

--files-from=パラメーターには、絶対パスをそのまま保持する場合は、末尾にスラッシュが必要です。したがって、コマンドは次のようになります。

rsync -av --files-from=/path/to/file / /tmp/

これは、多数のファイルがあり、すべてのファイルをxパスにコピーするように実行できます。したがって、ファイルを見つけて、以下のようなファイルに出力をスローします。

find /var/* -name *.log > file
10
Waqas Khan

記録については、上記以外の回答は1つを除いて役に立ちませんでした。要約すると、次のいずれかを使用して、--files-from=を使用してバックアップ操作を実行できます。

 rsync -aSvuc `cat rsync-src-files` /mnt/d/rsync_test/

OR

 rsync -aSvuc --recursive --files-from = rsync-src-files。 /mnt/d/rsync_test/

前のコマンドは、ファイルの内容rsync-src-filesのほかに、以下で詳しく説明します。後者のバージョンを使用する場合は、次の4つの注意事項に留意する必要があります。

  1. --files-fromsourceディレクトリの両方を指定する必要があることに注意してください
  2. --recursiveを明示的に指定する必要があります。
  3. ファイルrsync-src-filesはユーザーが作成したファイルであり、このテストのためにsrcディレクトリ内に配置されました
  4. rsyn-src-filesには、コピーするファイルとフォルダーが含まれており、ソースディレクトリに関連して取得されます。重要:ファイルに末尾のスペースや空白行がないことを確認してください。以下の例では、3行ではなく2行しかありません(偶然見つけてください)。 rsynch-src-filesの内容は次のとおりです。

folderName1
folderName2

5
K F

私は同様のタスクを得ました:指定された日付の後に変更されたすべてのファイルをrsyncしますが、いくつかのディレクトリを除外します。 1つのライナーオールインワンスタイルを構築することは困難であったため、問題をより小さなピースに分割しました。最終的解決:

find  ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | egrep -v "/\..|Downloads|FOO" > FileList.txt
rsync -v --files-from=FileList.txt ~/sourceDIR /Destination

最初にfind -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"を使用します。名前パターンを除外するためにregex行にfindを追加しようとしましたが、Linux(Mint)の私のフレーバーはfindの否定表現を理解しません。正規表現フレーバーの試行回数-必要に応じて動作しません。だから、egrep -v-パターンの簡単な方法を除外するオプションになります。私のrsync/。cache/。configのようなディレクトリと、明示的に名前を付けたいくつかのディレクトリをコピーしていません。

1
sopel
$ date
  Wed 24 Apr 2019 09:54:53 AM PDT
$ rsync --version
  rsync  version 3.1.3  protocol version 31
  ...

構文:rsync <file_/_folder_list> <source> <target>

Folder名前(ここでは、WITH a /;例Cancer - Evolution/)はフォルダーリストファイル(例:cm_folder_list_test)にあります:

# /mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test
# test file: 2019-04-24
Cancer/
Cancer - Evolution/
Cancer - Genomic Variants/
Cancer - Metastasis (EMT Transition ...)/
Cancer Pathways, Networks/
Catabolism - Autophagy; Phagosomes; Mitophagy/
Catabolism - Lysosomes/

末尾の/を含めない場合、rsyncされたターゲットフォルダーは作成されますが、空です。

これらのフォルダー名は残りのパス(/home/victoria/Mail/2_RESEARCH - NEWS)に追加されるため、rsyncへの完全なフォルダーパスが提供されます。例:/home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/

--files-from=ではなく--include-from= ...も使用する必要があることに注意してください。

rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/

(私のBASHスクリプトでは、変数$INを次のように定義しました。)

BASEDIR="/mnt/Vancouver/projects/ie/claws"
IN=$BASEDIR/data/test/input

使用されるrsyncオプション:

 -a  :   archive: equals -rlptgoD (no -H,-A,-X)
    -r  :   recursive
    -l  :   copy symlinks as symlinks
    -p  :   preserve permissions
    -t  :   preserve modification times 
    -g  :   preserve group 
    -o  :   preserve owner (super-user only) 
    -D  :   same as --devices --specials 
  -q  :   quiet (https://serverfault.com/questions/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that AREN’T ON THE SENDING SIDE), but only for the directories that are
    being synchronized.  You must have asked rsync to send the whole directory
    (e.g.  "dir" or "dir/") without using a wildcard for the directory’s contents
    (e.g. "dir/*") since the wildcard is expanded by the Shell and rsync thus
    gets a request to transfer individual files, not the files’ parent directory.
    Files  that  are  excluded  from  the transfer are also excluded from being
    deleted unless you use the --delete-excluded option or mark the rules as
    only matching on the sending side (see the include/exclude modifiers in the
    FILTER RULES section).  ...
0
Victoria Stuart

この回答は質問に対する直接的な回答ではありません。しかし、それはあなたの問題に最適なソリューションを見つけるのに役立ちます。

問題を分析するときは、デバッグオプション-vvを有効にする必要があります

次に、rsyncはどのファイルがどのパターンに含まれるか、どのパターンによって除外されるかを出力します。

building file list ... 
[sender] hiding file FILE1 because of pattern FILE1*
[sender] showing file FILE2 because of pattern *
0
Matthias M