特定のファイルを含むすべてのディレクトリをrsyncする

特定のファイルを含むすべてのディレクトリをrsyncする

私は公開鍵とパスワードの両方を必要とするクラスターで作業しており、このクラスターでの作業を整理するために複雑なファイル構造を持っており、一部のディレクトリのみをローカル マシンにバックアップしたいと考えています。

rsync で「backup」という名前のファイルがあるディレクトリのみを取得するようにします。例:

data/sub1/sub1_1/backup < back up this directory
data/sub1/sub1_2/ < don't back up

このパスワードの問題のため、ssh を複数回呼び出すスクリプトを避けたいのですが、rsync でそれを実行できる高度なフィルターはありますか?

答え1

バックアップするディレクトリの数がそれほど多くない場合は、bash シェルスクリプトを使用してコマンド ラインにディレクトリを配置できます。次のシェルスクリプトはデモです。

ディレクトリ構造

$ tree data
data
└── sub1
    ├── sub1_1
    │   ├── a
    │   ├── b
    │   └── backup
    ├── sub1_2
    │   └── c
    └── sub1_3
        ├── backup
        └── d

4 directories, 6 files

シェルスクリプトrsyncer

#!/bin/bash

echo -n 'rsync -avn ' > command
find . -name 'backup' -type f | sed -e 's%/backup%%' -e 's%.*%"&"%' | tr '\n' ' ' >> command
echo ' target/' >> command

bash command

予行演習

$ ./rsyncer 
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d

sent 199 bytes  received 64 bytes  526.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

sub1/sub1_に注意してください2そしてファイルcリストに載っていません。

バックアップ

シェルスクリプトのrsyncからオプションを削除しnて実行するか、ファイルからオプションを削除しcommandて実行します。

sed 's/-avn/-av/' command > buper

$ bash buper
sending incremental file list
created directory target
sub1_1/
sub1_1/a
sub1_1/b
sub1_1/backup
sub1_3/
sub1_3/backup
sub1_3/d

sent 383 bytes  received 148 bytes  1,062.00 bytes/sec
total size is 0  speedup is 0.00

$ tree target
target
├── sub1_1
│   ├── a
│   ├── b
│   └── backup
└── sub1_3
    ├── backup
    └── d

2 directories, 5 files

sub1/sub1_に注意してください2そしてファイルcリストに載っていません。

答え2

おそらく、それのようなものを使用できるでしょう。

  1. コマンドを使用してfind、興味のあるファイルを検索します。
  2. これらを実行するdirnameと、ファイルが保存されているディレクトリ名が印刷されます。
  3. uniqディレクトリにリストされるのは以下のものだけです
  4. rsync で結果を反復処理するか、それらをまとめて、rsync が 1 回だけ呼び出されるようにします。

簡単なスクリプト:

for i in $(find . -name 'backup' -type f | xargs dirname | uniq); do
  echo "here: $i"
  # here goes rsync
done

関連情報