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


93

リモートサーバーにプッシュするさまざまなサブディレクトリに約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の内容は、アップロードするファイルへの相対パスを改行で区切ったリストです。

月曜日の朝に私を脱出させる、これを行うより良い方法はありますか?

回答:


3

編集:以下のジョシップロダンの答えが良いです。あれを使ってください!

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

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

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


9
残念ながら、これは大きなリストや名前にスペースが含まれているファイルでは機能しません。
ウェスモード

3
[引数リストが長すぎる]
ダンコデビッド・

デフォルトでは、xargsはstdinからコマンドラインの最後に引数を追加します。rsyncが最後の引数を宛先にする必要があるため、これは機能しません。xargsの一部のバージョンでは、代わりに引数をコマンドラインの途中に挿入することもできます。ファイルのリストが長い場合にrsyncが複数回実行される可能性があることを気にしない限り、これは機能するはずです。いずれにせよ、rsync --files-fromおそらくこれはより簡単で信頼性の高いソリューションです:)
Lassi

ウェスハーダーカー:「ジョシップロダンの答え」へのあなたの編集と参照は、ロダンが編集した@atpの答えを実際に参照していますか?
Seamus

228

--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-の前でも後でも同じように機能します)。から、--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オプションが有効になっていると、そのdirの階層全体も転送されます(-aは-aに含まれないため、-files-fromで-rを明示的に指定する必要があることに注意してください)。また、(デフォルトで有効になっている)--relativeオプションの効果は、ファイルから読み取られたパス情報のみが複製されることにも注意してください。ソース仕様パス(この場合は/ 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はファイルリスト要素に変換された後、最終的にそれらの複製を解除します。


22
リストされたファイルが置かれているディレクトリを指定する必要があることに注意してください。たとえばrsync -av --files-from=file-list . target/、現在のディレクトリからファイルをコピーする場合などです。
Nicolas Mattia

7
はい、繰り返しますThe filenames that are read from the FILE are all relative to the source dir
16

ああ、すみません、すみません!
Nicolas Mattia

1
files-fromファイルに..rsyncで始まるものがある場合、次の..ようなエラーが表示されますrsync: link_stat "/home/michael/test/subdir/test.txt" failed: No such file or directory(この場合は、「test」ディレクトリから実行され、存在する「../subdir/test.txt」を指定しようとしています)
マイケル

--files-from引数は、包含と除外の明示的なリストと組み合わせることができますか。また、リストのファイルは、--files-from既存の除外ルールを上書きして追加され、ファイルに表示された場合に含まれるようになりますか?
highsciguy 2018年

12

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

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

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

find /var/* -name *.log > file

8

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

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

または

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

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

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

folderName1
folderName2


3

私は同様のタスクを得ました:特定の日付以降に変更されたすべてのファイルをrsyncするが、一部のディレクトリを除外します。ワンライナーオールインワンスタイルを作るのが難しかったので、問題を細かく切り分けました。最終的解決:

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プラス明示的に指定いくつかの他のIを。


1
プロセス置換を使用してこれをbashワンライナーに変えることができると思います:rsync -v --files-from=<(find ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | grep -Ev "/\..|Downloads|FOO") ~/sourceDIR /Destination
phk

2
$ 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>

フォルダー名(ここでは、末尾に/;など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 (/server/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).  ...

1

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

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

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

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

0

私が持っていたすべてがディレクトリのリストだったとき、これらの答えはどれも私にとってうまくいきませんでした。それから私は解決策を見つけました!このシナリオでは再帰的ではないため、追加-rする--files-from必要-aがあります(誰が知っていましたか?!)。

rsync -aruRP --files-from=directory.list . ../new/location

ファイルに「dir」をリストする場合は、-r / —recursiveを指定する必要があります。「dir /」をリストする場合は、リストしません。
lbutlr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.