質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

4回答

13316閲覧

cpコマンドオプション「-r」の再帰的について

Ayuzaki

総合スコア13

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2019/11/13 02:03

初歩的な質問で恐縮ですが、ご教示下さい。

cpコマンドのオプション「-r」を使用した再帰的なコピーですが、これまで「ディレクトリを丸っとコピーする」的なあいまいな解釈で使用してきました。
改めて「再帰的」に向き合ってみようと思いましたが、頭の中で整理することができません。

例えば、以下のようなディレクトリ構成の場合で、

Linux

1ls -R /home/hoge/ 2/home/hoge/: 3dir1 dir2 4 5/home/hoge/dir1: 6aaa.txt bbb.txt 7 8/home/hoge/dir2:

以下の再帰的コピーコマンドを実行します。

Linux

1cp -r /home/hoge/dir1/ /home/hoge/dir2/

すると以下のディレクトリ構造となります。

Linux

1ls -R /home/hoge/ 2/home/hoge/: 3dir1 dir2 4 5/home/hoge/dir1: 6aaa.txt bbb.txt 7 8/home/hoge/dir2: 9dir1 10 11/home/hoge/dir2/dir1: 12aaa.txt bbb.txt

これまでの「ディレクトリを丸っとコピーする」という解釈では上記の構造となるのは納得できるのですが、私の「再帰的」という動作の解釈は以下です。

まず、ディレクトリ内に存在するものに一つ一つに対して処理をする。

その際、その一つがディレクトリだったら、
そのディレクトリ内に存在するものに一つ一つに対して処理をする。
その際、その一つがディレクトリだったら...

上記の解釈だと、先程の再帰的コピーコマンドは以下の処理が実行されるのと同義ではないかと思いました。

Linux

1cp -r /home/hoge/dir1/ /home/hoge/dir2/ 231. まず/home/hoge/dir1/ディレクトリ(のみ)を /home/hoge/dir2/にコピー 42. dir1ディレクトリ内のファイル aaa.txt に同様の処理、つまり cp /home/hoge/dir1/aaa.txt /home/hoge/dir2/ 53. dir1ディレクトリ内のファイル bbb.txt に同様の処理、つまり cp /home/hoge/dir1/bbb.txt /home/hoge/dir2/

しかし当たり前ですが上記1〜3の処理では再帰的コマンド実行時と同様の結果になりません。
(dir2ディレクトリ直下に 空のdir1ディレクトリ、aaa.txt、bbb.txt が存在する状態になる)

そもそも再帰的コマンドを分解して解釈しようとするのがご法度なのかもしれませんが、、、
すみません。「そういうものだよ」と納得するのが悔しく、ちゃんと「再帰的」と向き合いたいと思いご質問させていただきました。

以上、「再帰的」の捉え方について良い解釈がございましたらご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

参考情報

  • cp -r はコピー先ディレクトリが存在するかで動作が異なる

https://qiita.com/mangano-ito/items/87d269325ff29c95f0ef

  • cpコマンドでディレクトリを再帰的にコピーする時に気持ちが伝わらなすぎるのでcpコマンドでの失敗を記録してみた

[https://qiita.com/ponsuke0531/items/660bcbf12e0692a49d12(https://qiita.com/ponsuke0531/items/660bcbf12e0692a49d12)

  • 方法: ディレクトリをコピーする

https://docs.microsoft.com/ja-jp/dotnet/standard/io/how-to-copy-directories

投稿2019/11/14 22:18

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私の「再帰的」という動作の解釈は以下です。

解釈はあっていますが、コピー先は「元のディレクトリと対応する、コピー先のディレクトリ」となります。

投稿2019/11/13 02:11

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ディレクトリがなければそれを作ってはファイルをコピーしていくということ

投稿2019/11/13 02:10

編集2019/11/13 02:11
yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

dir1以下を、dir2に再帰的にコピーする、ということなんで、その結果で合ってると思いますが

cp -r /home/hoge/dir1 /home/hoge/dir2/

という解釈になっているんじゃないかと

ついでに
cp -r /home/hoge/dir1/* /home/hoge/dir2/
ではどういう動作が期待されるのかを考えてみては

投稿2019/11/13 02:08

編集2019/11/13 02:14
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問