目的
cp
, rsync
, mv
, rm
の挙動を理解する。
結論
ディレクトリの中身を丸ごとコピー・移動する
aaa_parent/aaa_source/
ディレクトリの中身をそのまま、ddd_parent/ddd_dest/
にコピーしたい場合、下記のいずれかのコマンドを使用するのがいい。
~/practice$ rm -rf ddd_parent/ddd_dest/ ※ コピー先ディレクトリに余計なファイルがある場合
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ cp -a aaa_parent/aaa_source/. ddd_parent/ddd_dest/
~/practice$ rm -rf ddd_parent/ddd_dest/ ※ コピー先ディレクトリに余計なファイルがある場合
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ rsync -a aaa_parent/aaa_source/. ddd_parent/ddd_dest/
aaa_parent/aaa_source/
ディレクトリの中身をそのまま、ddd_parent/ddd_dest/
に移動したい場合、下記のコマンドを使用するのがいい。
~/practice$ rm -rf ddd_parent/ddd_dest/
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ cp -a aaa_parent/aaa_source/. ddd_parent/ddd_dest/
~/practice$ rm -rf aaa_parent/aaa_source/
~/practice$ mkdir -p aaa_parent/aaa_source/ ※ aaa_parent/aaa_source/ ディレクトリを残しておきたい場合
ファイルをコピー・移動する
aaa_parent/aaa_source/.bbb
ファイルを、ddd_parent/ddd_dest/.bbb
として配置されるようにコピーする。
~/practice$ rm -rf ddd_parent/ddd_dest/.bbb ※ これをしないと ddd_parent/ddd_dest/.bbb フォルダがある場合、ddd_parent/ddd_dest/.bbb/.bbb として配置されてしまう。
~/practice$ mkdir -p ddd_parent/ddd_dest/
# (1) OK
~/practice$ cp aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/.bbb
# (2) OK
~/practice$ cp aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/
# (3) 非推奨
# ddd_parent/ddd_dest ディレクトリがなく、ddd_parent ディレクトリのみがある場合、.bbb ファイルが ddd_parent/ddd_dest ファイルとして配置されてしまう。
~/practice$ cp aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest
aaa_parent/aaa_source/.bbb
ファイルを、ddd_parent/ddd_dest/.bbb
として配置されるように移動する。
~/practice$ rm -rf ddd_parent/ddd_dest/.bbb ※ これをしないと ddd_parent/ddd_dest/.bbb フォルダがある場合、ddd_parent/ddd_dest/.bbb/.bbb として配置されてしまう。
~/practice$ mkdir -p ddd_parent/ddd_dest/
# (1) OK
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/.bbb
# (2) OK
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/
# (3) 非推奨
# ddd_parent/ddd_dest ディレクトリがなく、ddd_parent ディレクトリのみがある場合、.bbb ファイルが ddd_parent/ddd_dest ファイルとして配置されてしまう。
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest
検証
cp
コマンド
aaa_parent/aaa_source/
ディレクトリの中身をそのまま、ddd_parent/ddd_dest/
にコピーしたいとする。
現在のディレクトリ構成は下記である。
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
2 directories, 4 files
(方法1) 成功
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ cp -a aaa_parent/aaa_source/. ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 6 files
(方法2) 失敗
隠しファイルがコピーされない。
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ cp -a aaa_parent/aaa_source/* ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ └── ccc.txt
└── memo.md
4 directories, 5 files
(方法3)
下記の検証を見てもらうとわかるが、コピー先のディレクトリがあるかどうかで挙動が変わってくる。
(方法3-1) 成功
~/practice$ mkdir -p ddd_parent/
~/practice$ cp -a aaa_parent/aaa_source/ ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 6 files
(方法3-2) 失敗
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ cp -a aaa_parent/aaa_source/ ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
5 directories, 6 files
rsync
コマンド
目的は cp
コマンドの時と同じ。
(方法1) 成功
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ rsync -a aaa_parent/aaa_source/. ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 6 files
(方法2) 失敗
隠しファイルがコピーされない。
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ rsync -a aaa_parent/aaa_source/* ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ └── ccc.txt
└── memo.md
4 directories, 5 files
(方法3)
下記の検証を見ると、コピー先のディレクトリの有無は、挙動に関係ないみたい。
(方法3-1) 成功
~/practice$ mkdir -p ddd_parent/
~/practice$ rsync -a aaa_parent/aaa_source/ ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 6 files
(方法3-2) 成功
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ rsync -a aaa_parent/aaa_source/ ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 6 files
mv
コマンド
aaa_parent/aaa_source/
ディレクトリの中身をそのまま、ddd_parent/ddd_dest/
に移動したいとする。
aaa_sourceディレクトリは消えてもいいし、残ってもいいとする
現在のディレクトリ構成は下記である。
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
2 directories, 4 files
(方法1) 失敗
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/. ddd_parent/ddd_dest/
mv: cannot move 'aaa_parent/aaa_source/.' to 'ddd_parent/ddd_dest/.': Device or resource busy
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
└── memo.md
4 directories, 4 files
(方法2) 失敗
隠しファイルが移動されない。
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/* ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ └── .bbb
├── ddd_parent
│ └── ddd_dest
│ └── ccc.txt
└── memo.md
4 directories, 4 files
(方法3)
(方法3-1) 成功
aaa_sourceディレクトリは消える
~/practice$ mkdir -p ddd_parent/
~/practice$ mv aaa_parent/aaa_source/ ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
3 directories, 4 files
(方法3-2) 失敗
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/ ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
├── ddd_parent
│ └── ddd_dest
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 4 files
(方法4) ディレクトリ構成の結果的には成功だが、エラー出てるので失敗
aaa_sourceディレクトリは残る
エラー終了しているが、目的は達成できている。
'aaa_parent/aaa_source/.'
(aaa_source
ディレクトリにとってのカレントディレクトリ) と 'aaa_parent/aaa_source/..'
(aaa_source
ディレクトリにとっての親ディレクトリ) の移動は失敗しているが、.bbb の移動には成功している。
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/* aaa_parent/aaa_source/.* ddd_parent/ddd_dest/
mv: cannot move 'aaa_parent/aaa_source/.' to 'ddd_parent/ddd_dest/.': Device or resource busy
mv: cannot move 'aaa_parent/aaa_source/..' to 'ddd_parent/ddd_dest/..': Device or resource busy
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
4 directories, 4 files
(方法5) 成功
aaa_sourceディレクトリは消える
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ cp -a aaa_parent/aaa_source/. ddd_parent/ddd_dest/
~/practice$ rm -rf aaa_parent/aaa_source/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
├── ddd_parent
│ └── ddd_dest
│ ├── .bbb
│ └── ccc.txt
└── memo.md
3 directories, 4 files
rm
コマンド
aaa_parent/aaa_source/
ディレクトリの中身を削除したい。
aaa_parent/aaa_source/
ディレクトリは残ってもいいし、消えてもいいとする。
現在のディレクトリ構成は下記である。
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
2 directories, 4 files
(方法1) 成功
aaa_sourceディレクトリは消える
~/practice$ rm -rf aaa_parent/aaa_source/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
└── memo.md
1 directory, 2 files
(方法2) 失敗
隠しファイルが削除されない。
~/practice$ rm -rf aaa_parent/aaa_source/*
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ └── .bbb
└── memo.md
2 directories, 3 files
(方法3) 失敗
~/practice$ rm -rf aaa_parent/aaa_source/.
rm: refusing to remove '.' or '..' directory: skipping 'aaa_parent/aaa_source/.'
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
2 directories, 4 files
mv
コマンドでファイルを移動する。
aaa_parent/aaa_source/.bbb
を ddd_parent/ddd_dest
の中に移動したい。
現在のディレクトリ構成は下記。
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
└── memo.md
2 directories, 4 files
(方法1-1) 成功
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ └── .bbb
└── memo.md
4 directories, 4 files
(方法1-2) 成功
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ └── .bbb
└── memo.md
4 directories, 4 file
(方法1-3) 成功
~/practice$ mkdir -p ddd_parent/ddd_dest/
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/.bbb
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
│ └── .bbb
└── memo.md
4 directories, 4 files
(方法2-1) 失敗
~/practice$ mkdir -p ddd_parent/
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/
mv: cannot move 'aaa_parent/aaa_source/.bbb' to 'ddd_parent/ddd_dest/': Not a directory
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
└── memo.md
3 directories, 4 files
(方法2-2) 失敗
ddd_dest
はディレクトリではなくてファイルであり、.bbb
ファイルの名前が変更しただけである。
~/practice$ mkdir -p ddd_parent/
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ └── ccc.txt
├── ddd_parent
│ └── ddd_dest
└── memo.md
3 directories, 4 files
(方法2-3) 失敗
~/practice$ mkdir -p ddd_parent/
~/practice$ mv aaa_parent/aaa_source/.bbb ddd_parent/ddd_dest/.bbb
mv: cannot move 'aaa_parent/aaa_source/.bbb' to 'ddd_parent/ddd_dest/.bbb': No such file or directory
~/practice$ tree -a -L 4 -I ".git"
.
├── README.md
├── aaa_parent
│ └── aaa_source
│ ├── .bbb
│ └── ccc.txt
├── ddd_parent
└── memo.md
3 directories, 4 files