Linux でディレクトリ構造のみコピーする
概要
ディレクトリをそのままコピーするのじゃなくて、ディレクトリ構造のみをコピーしたいケースは無いででしょうか?
例えば、メールサーバーを移行した際に、ユーザーのメールボックスの領域だったり、Apacheでバーチャルホストを構築していてログディレクトリのみコピーしないとApacheを起動しないケースなど・・・
意外とあるかもしれないので、ディレクトリのみコピーする方法を紹介します
findとmkdirを組み合わせてコピー
ネットでディレクトリのみコピーとかで検索すると、よく検索結果にHITするケースです
下記のコマンドでは、/var/tmp/backup へ /home/log 以下のディレクトリをコピーしているますが、/var/tmp/backupのコピーするとコピー元の最下層のディレクトリは、「/var/tmp/backup/home/log」となり、フルパスでコピーしされいるので、少しやりたいこと違います。もう少しコマンドを繋げたらいい感じになると思いますが、コマンドが複雑になりそうです
$ find /home/log -type d | xargs -I{} mkdir -p /var/tmp/backup/{} $ ls /var/tmp/backup home
rsyncでディレクトリのみコピー
findとmkdirだと、ちゃんと動かなかったので、rysncを利用してディレクトリのみコピーします。
コマンドは以下のようにすればOKです
rsync -avz –include “*/" –exclude “*" 【コピー元】 【コピー先】
書式: rsync -avz --include "*/" --exclude "*" 【コピー元】 【コピー先】
例)/var/tmp/backup へ /home/log 以下のディレクトリ構造だけをコピーする。
$ rsync -avz --include "*/" --exclude "*" /home/log /var/tmp/backup $ ls /var/tmp/backup log
ディスカッション
コメント一覧
findとmkdirを使ったコピーですが、最後に/dirが足りないんじゃないですか?
正しくは:$ find /home/log -type d | xargs -I dir mkdir -p /var/tmp/backup/dir
指摘のあったとおりに、検証すると、下記のコマンドでディレクトリはコピーできました。フルパスにみたいになりますね
$ find /home/log -type d | xargs -I {} mkdir -p /var/tmp/backup/{}
rsyncの赤文字の行ですが、*の前の“が両方とも全角になっています。
あとincludeとexcludeは–ではないでしょうか。
どちらもその下の例では正しくなっていますが赤文字行をコピーして失敗したので一応ご報告まで。
赤字箇所ですが、シンタックスハイライト以外の箇所で、特殊文字を含む場合は勝手に文字がエスケープされる関係で*が大文字になっていたりするかと思います
素晴らしい記事ありがとうございます。
最後の例について、コピー元 と コピー先 が逆になっている様です。
> 例)/var/tmp/backup へ /home/log 以下のディレクトリ構造だけをコピーする。
> $ rsync -avz –include “*/” –exclude “*” /var/tmp/backup /home/log
$ rsync -avz –include “*/” –exclude “*” /home/log /var/tmp/backup
が正しいと思われます! (^ ^)/
ご指摘ありがとうございます。コピー元とコピー先が間違っている箇所は修正しました