構造を維持しながら、あるディレクトリの下のすべてのシンボリックリンクを別のディレクトリに再帰的にコピーする簡単な方法はありますか?

構造を維持しながら、あるディレクトリの下のすべてのシンボリックリンクを別のディレクトリに再帰的にコピーする簡単な方法はありますか?

~/tmp/foo/サブディレクトリ、ファイル、およびシンボリックリンクでいっぱいのディレクトリがあります。

$ tree ~/tmp/foo/
tmp/foo/
├── eggs
│   ├── baz
│   │   └── link3.txt -> /home/me/file3.txt
│   └── link2.txt -> /home/me/file2.txt
├── hello.txt
├── link1.txt -> /home/me/file1.txt
└── spam
    ├── link4.txt -> /home/me/file4.txt
    └── link5.txt -> /home/me/file5.txt

3 directories, 6 files

~/tmp/foo/asファイル(私が使用したものと同じ)の下のすべてのシンボリックリンクを別の(空ではない)ディレクトリに再帰的にcp -rHコピーしたいと思います~/bar/。これを行う簡単な方法はありますか?

私は以下を試しました:

find ~/tmp/foo/ -type l -print | rsync -avzL --files-from=- ~/tmp/foo/ ~/tmp/bar/

しかし、これは失敗しました。

ベストアンサー1

検索には結果にパスプレフィックスが含まれているため、検索パスがrsyncパスに基づいて「.」であることを確認してください。また、同様の間違いを犯した場合に警告するrsyncのエラーメッセージを読んでください。

rsync: link_stat "/test/a/a/1/3.txt" failed: No such file or directory (2)

以下は私に役立つ例です。

mkdir test
cd test
mkdir a b 
cd a
mkdir 1
echo 1 > 1/2.txt
ln -s 1/2.txt 1/3.txt
tree ../
../
├── a
│   └── 1
│       ├── 2.txt
│       └── 3.txt -> a/1/2.txt
└── b

それから

find . -type l | rsync -av --files-from=- ./ ../b/
building file list ... done
./
1/
1/3.txt -> a/1/2.txt

sent 99 bytes  received 25 bytes  248.00 bytes/sec
total size is 9  speedup is 0.07
tree ../
../
├── a
│   └── 1
│       ├── 2.txt
│       └── 3.txt -> a/1/2.txt
└── b
    └── 1
        └── 3.txt -> a/1/2.txt

4 directories, 3 files

失敗のために-Lコマンド(a / 1 / 2.txtをb / 1 / 2.txtに変更)が機能しないという意味であれば...なぜそのようなことが起こるのかわかりませんが、解決したいと思います。mount --bind --make-slave

おすすめ記事