CentOSでフォルダ階層だけをコピーしたい


はじめは挨拶

Qiita投稿始めました。
はじめまして。
よろしくお願いします。

記事の対象読者

「Linuxもコマンドラインもわからないよ。」なWindowsユーザ

シナリオ

  1. AフォルダsourceDirectoryとBフォルダtargetDirectoryが存在していて、
  2. Aフォルダのフォルダ構造のみをBフォルダへコピーしたい
  3. ただし、特定の名前のフォルダはコピー対象外excludeDirectoryとしたい

具体的には、
CVSからGitへ移行するときにgit-cvsimportを使用して移行しようと思ったが
git-cvsimportは空フォルダを移行してくれない。

ああああもう困った・・・・。何ができるのコマンドラインって!!!
そんなときに階層を合わせるために使えるコマンドが以下になります(めっちゃ早口)。

フォルダ階層コピーテンプレ

$ rsync -avz--exclude "{excDir/}" --include "*/" --exclude "*" {srcDir} {tarDir}
  • includeとexcludeは前から順に評価されるため記載順序に注意(ハマった)。
    この例では、

    • 1.excDirをコピー対象外に設定
    • 2. 1以外のすべてのフォルダをコピー対象
    • 3. 残り(のファイル)はすべて対象外
      の順に設定しているため表題の件が実現できています。

説明

  • excDir 除外対象のディレクトリ名(例えば「CVS」「.git」「.svn」などのソース管理ツール固有のフォルダ)
  • srcDir 移行元ディレクトリ (例えばCVSからチェックアウトされたプロジェクトフォルダ)
  • tarDir 移行先ディレクトリ (例えばgit-cvsimportを使用した際に作成される、空ディレクトリを含まないプロジェクトフォルダ)

移行元ディレクトリ(aDir)階層

# ツリーコマンドで階層を表示
$ tree aaaaDir/

aDir/
|-- CVS   ← このフォルダ以下は移行したくない
|   |-- Entries
|   `-- tmp
|-- a_dir
|   |-- aa_dir
|   |   `-- aaa_file.log
|   `-- aa_file.txt ← ファイルは移行したくない
`-- duplicateDir 
    |-- a_file.txt
    `-- du_aDir ← 重複しているフォルダの下のフォルダ

移行先ディレクトリ(bDir)階層

$ tree bbbbDir/

bDir/
|-- b_dir
|   `-- bb_file.txt
|-- b_log.log
`-- duplicateDir

rsyncコピー実行

# -abzはおまじない
$ rsync -avz --exclude "CVS/" --include "*/" --exclude "*" aDir/ bDir/

# 以下は実行ログ(よくわからん)
sending incremental file list
a_dir/
a_dir/aa_dir/
duplicateDir/
duplicateDir/du_aDir/

rsyncコピー実行後(bDir)階層

# CVSフォルダは移行されていない
bDir/
|-- a_dir
|   `-- aa_dir # aのファイル群は移行されていない
|-- b_dir
|   `-- bb_file.txt
|-- b_log.log
`-- duplicateDir
    `-- du_aDir #  重複しているフォルダの下のフォルダは移行される

Windowsマン向け番外

  • yum install treeでtreeコマンドインストール
  • yum install rsyncでrsyncコマンドインストール

以上です。Qiita初投稿楽しかったです。