次のテキストファイルがあります
...
/a/b/c/f1
/a/b/c/f2
...
/a/b/c/d1
...
どこにファイルがありますがf1
、ディレクトリです。正確な階層をターゲットフォルダ()にコピーしたいと思います。f2
d1
/z
Bashを使用すると、lr
テキストファイルから読み取られたすべての行に対して私のスクリプトが実行されます(単純化のためにこれらのオプションは省略しました)。
rsync $lr/ /z/$lr
/z/a/b/c/d1
結果をファイルに対して.Unfortunately(残念ながら)取得すると、フォルダは正しくコピーされます。
/z/a/b/c/f1/f1
/z/a/b/c/f2/f2
rsync
ファイルとディレクトリに対して上記と同じ呼び出しを使用して、この問題をどのように解決できますか?
答え1
ファイルを手動で再同期しないでください。--files-from=
テキストファイルを含めるには、このオプションを使用します。
ディレクトリルール:
- パスが末尾で終わらない場合にのみディレクトリを作成します。
/
- ディレクトリの内容を同期させるには、末尾またはオプション
/
を追加します。--recursive
-r
オプションを使用し-a
て再帰したい場合は、-r
追加する必要があります。ファイルのパスがソースディレクトリと相対的であることを確認してください(先頭を含めるか除く/
)。
入力の最小例は次のとおりです。
rsync --files-from=textfile / /z
テキストファイルを事前に変更/フィルタリングする必要がある場合は、stdinからrsyncに渡すことができます。
your_command textfile | rsync --files-from=- / /z
答え2
あなたの命令を見てみましょうrsync
。オプションを省略しました。これが重要です。したがって、-a
(--archive
)または-rt
()を使用すると仮定し、--recursive --times
便宜のために-v
()も追加します--verbose
。
次のテキストファイルからソースファイルを読み込んでいます。
/a/b/c/f1 /a/b/c/f2 ... /a/b/c/d1
テキストファイルの各行を読み取るための次のテンプレートがあります$lr
。
rsync $lr/ /z/$lr
テンプレートコマンドに対応する行のf1
合計を適用しd1
、結果を見てみましょう。
mkdir -p /tmp/733765
cd /tmp/733765
mkdir -p a/b/c/d1
touch a/b/c/{f1,f2,d1/f3} z
rsync -av a/b/c/f1/ z/a/b/c/f1
rsync -av a/b/c/d1/ z/a/b/c/d1
私たちは、私たちに示された情報に基づいて、次の事実をすぐに知ることができます。文書 f1
コピーされません。代わりにこのエラーが発生します。
rsync: [sender] change_dir "/tmp/733765/a/b/c/f1" failed: Not a directory (20)
ターゲットに表示されている場合は、f1
別の解決策(おそらく以前の試み)を使用してコピーされた可能性がありますrsync
。
同様にd1
、ディレクトリパスをすでに作成していない限り、宛先にコピーされませんz/a/b/c
。
rsync: [Receiver] mkdir "/tmp/733765/z/a/b/c/d1" failed: No such file or directory (2)
mkdir -p z/a/b/c
rsync -av a/b/c/d1/ z/a/b/c/d1
created directory z/a/b/c/d1
./
f3
sent 122 bytes received 71 bytes 128.67 bytes/sec
あなたの質問の情報の一部が正しくありません。そのコマンドを無視しrsync
てソースデータセットに焦点を当てたら、次のようにrsync
ソースデータセットを直接読み取ることができます。
rsync --files-from /path/to/source_data_file -arv . z/
-a
通常はインクルードを使用しているため、これはやや奇妙に思えるかもしれません-r
。ただし、--files-from
ソースデータファイルにディレクトリを使用して指定したため、リストされたソースディレクトリの再帰を通知する-r
ために明示的に指定する必要があります。rsync
(これがなければ、名前付きファイルのみコピーできます。)