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

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

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

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

UNIX

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

Q&A

解決済

2回答

827閲覧

Unixで "."はカレントディレクトリを指すと思っていましたが、では "cp -r old/ new/" と "cp -r old/. new/" で結果が違うのはなぜですか?

hiroga

総合スコア91

Linux

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

UNIX

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

1グッド

2クリップ

投稿2020/01/11 06:15

編集2020/01/12 02:53

カレントディレクトリの中身だけを別のディレクトリにコピーしたいと考えています。

次のようなコマンドで実行可能なことは理解しています。

cp -r old/. new/ cp -r old/* new/

ここで気になるのですが、 cp -r old/. new/ は 「ディレクトリoldをnewの下にコピーする」という意味になりませんか?
結果としてoldの中身だけがnewの下にコピーされているのですが、どうしてそうなるのかが不思議です。
ご回答、よろしくお願いします。

環境

  • macOS Catalina

追記

2020-01-12: -r オプションをつけ忘れていたため、追記しました。ご指摘ありがとうございます。

katsuko👍を押しています

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

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

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

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

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

y_waiwai

2020/01/11 11:56

どういうふうに結果が違うんでしょうか
guest

回答2

0

ベストアンサー

まずは、ちょっと揚げ足取りになりますが、質問にあるコマンドだとエラーになりますね。
「-r」オプションをつけている、と解釈します。

質問を見て、私も「アレ、そうなの?」と思いました。実際試してみると、確かにそのとおりですね。
old」と「old/.」は同じファイルですので、

cp -r old/. new/ cp -r old new/

は同じ動きをするもの、と考えました。

というわけで、cpのソースコードを追っかけてみました。
(見たソースはGNUのソースっぽいので、macとは違うかもしれませんが)
気になったのは、以下の点です。

c

1 char *arg_base; 2 /* Append the last component of 'arg' to 'target_directory'. */ 3 ASSIGN_STRDUPA (arg_base, last_component (arg)); 4 strip_trailing_slashes (arg_base); 5 /* For 'cp -R source/.. dest', don't copy into 'dest/..'. */ 6 dst_name = (STREQ (arg_base, "..") 7 ? xstrdup (target_directory) 8 : file_name_concat (target_directory, arg_base, 9 NULL));

コメントで「Append the last component of 'arg' to 'target_directory'.」と書かれています。
日本語に訳すと「『arg』(これは、ソースファイルパスです)の『last component』を『target_directory』(コピー先パス)に追加する」ですね。

この「last component」とは何か、ちょっとそこまでソースを追いきれなかったのですが、想像すると「パスのスラッシュを区切りにして分割した物の最後の部分」(例えば、「aaa/bbb/ccc」というパスであれば「ccc」)と解釈します。
すると、どうでしょう。「old/.」であれば、コピー先のパスは「new/.」になり、「old」であれば、コピー先のパスは「new/old」になります。

つまり、「cpコマンドは、コピー先のパスはコピー元のbasenameを追加したパスになるから」というのが答えのようです。

投稿2020/01/11 17:16

katsuko

総合スコア3469

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

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

hiroga

2020/01/12 02:53

ありがとうございます。つまり、 1. cpコマンドのコピーの対象は、ファイルを指定すればファイル、-rオプションでディレクトリを指定すればその中のファイル 2. コピー先のパスがディレクトリなら、コピー元のパスの最後の要素をコピー先のパスにappendする ということなのですね! とても勉強になりました。
guest

0

old/old/. そもそも意味合いが異なると思います。
old/ は oldディレクトリを指します。
old/. は oldディレクトリの1階層下の位置を指しています。

ですので、 

cp old/. new/ は 「ディレクトリoldをnewの下にコピーする」という意味になりませんか?

という質問にはなりませんというお答えになると思います。

投稿2020/01/11 15:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問