/間でコンテンツフォルダをコピーします。およびLinuxの/ *


8

私が読んだフォルダからコンテンツをコピーするには、次のように使用します。

cp -rfva ../foldersource/. ./

しかし、これも機能します

cp -rfva ../foldersource/* ./

違いはありますか?

たとえば、でフォルダからコンテンツを削除したい場合。:

rm -rf ../foldersource/.

私はエラーが出ます:

rm:  rejet delete folder '.' or '..':

アスタリスクを付けても大丈夫です

rm -rf ../foldersource/*

だから、アスタリスクはどこでも機能するより良いオプションですか?

回答:


10

これら2つの引数形式の間には根本的な違いがあります。そして、何が起こっているのかを理解することは重要です。

では../foldersource/.、引数、それはだかどうか、コマンドにそのまま渡されるcpか、rmまたは何か他のもの。末尾のドットが、それが存在するディレクトリを単にポイントするという標準的なUnixの規則とは異なる特別なまたは固有のセマンティクスを持つかどうかは、コマンド次第です。両方rmcpそれを特別なケースとして扱うようです。

では../foldersource/*引数は最初のシェルで展開される前に、コマンドは、これまでにも実行され、任意の引数が渡されます。したがって、rm決して見ません../foldersource/*。展開されたバージョン../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1などが表示されます。オペレーティングシステムはコマンドに渡すことができる引数の数を制限するため、これは重要です。通常は数百のみです。


4
It's up to the command whether that trailing dot makes any senseええと、ドットは常にそれを含むディレクトリ自体にリンクしているので../foldersource/.、述べることと何の違いもないはずで./foldersource/あり、実際には同じことを述べるための冗長な方法にすぎません。Linux / Unixファイルシステムの標準であるため、ドットまたはダブルドットを「理解」しようとするコマンドはありません。回答に記載さrmれてjimmijいるように、現在の作業ディレクトリの削除を単に拒否します。また、./OPが../ある間は、すべての例で使用していることに注意してください。多少の(大きな)違い。
Sergiy Kolodyazhnyy 2017

"cp -rfva ../foldersource/。./"は "cp -rfva ../foldersource ./"と同じですが、フォルダールートではなく、フォルダーソースのコンテンツをコピーします
stackdave

1
@Stackdaveいいえ、cp -rfva ../foldersource/. ./ と同等はありませんcp -rfva ../foldersource ./。トレーリング/.は重要です
roaima 2017

2
この答えは正しいですが、@ roaimaの答えで述べたように、非常に重要な違いがありません。/*バリアントは(通常)で始まるファイルまたはディレクトリをコピーしません。
アダム

@SergiyKolodyazhnyyあなたは正しいです。これ.は、現在を直接表すUnixの標準的な規則です。また、私が使用./するべきだったときに、私の例で使用したことを指摘していただきありがとうございます../。直します。コマンドが末尾のドットを「理解する」かどうかについては正しくありません。OPは指摘(と私は経験してきたようにcp)両方rmcp末尾が異なる動作をする場合.が存在します。「末尾のドットに特別なまたは独自のセマンティクスがあるかどうかは、コマンド次第」のように書いておくべきでした。わかりやすくするために回答を変更します。
エストラーダ2017

10

を使用しcp -a source/* target/てコピーすると、ほとんどのファイルとディレクトリがからsourceにコピーされtargetます。具体的には、除外されるアイテム.は、の最上位のドット()で始まるファイルですsource

これらのファイル(またはディレクトリ)を source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will not be copied

を使用してコピーするcp -a source/. target/場合はsource、ドット(.)で始まるすべてのアイテムを含む、target

これらのファイル(またはディレクトリ)を source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will be copied

あなたが使用している場合bashzshは、使用することができますdotglobオプションをの意味は変更する*ことが(ドットで始まるファイルやディレクトリを含むようにyashも持っているdotglobが、それは、含まれて、オプションを.して..。その使いやすさを制限グロブ展開でも参照をFIGNORE='@(.|..)'ksh93)。

興味深いことに、コンポーネントを作成しないことcp -a source/. target/が保証されています。(一方、はすでに存在するかどうかに応じて2つのことのいずれかを行います。詳細については、cp使用してべき等の方法でフォルダーを再帰的にコピーする方法を参照してください。)target/sourcecp -a source target/target


を使用しrm -rf source/*て削除sourceすると、ドット(.)で始まらないファイルとディレクトリが削除されます。dotglobすでに述べた設定に従います。ディレクトリsource自体は削除されません。

POSIXは、最後のコンポーネントがまたはであるパスの削除を禁止しているためrm -rf source/.他のユーザーがすでに説明したように、それを使用して削除しようとすると失敗します。最も近いものはであり、ドット()で始まるかどうかに関係なく、ディレクトリとそのすべての内容が削除されます。...rm -rf sourcesource.


1
「rm。*」は親ディレクトリを削除しますか?も参照してくださいrm -rf .失敗について。
ステファンChazelas

7

マニュアルに明記されているように、これは許可さrm -rf ../foldersource/.れてrmいないため、実行できません。

最後のファイル名コンポーネントが「。」であるファイルを削除しようとする試み。または「..」は、POSIXで義務付けられているように、プロンプトなしで拒否されます。

POSIXマニュアルman 1p rmには次のように表示されます。

ファイルドットまたはドットドットのいずれかがオペランド(つまり、最終パス名コンポーネント)のベース名部分として指定されている場合、またはオペランドがルートディレクトリに解決される場合、rmは標準エラーに診断メッセージを書き込み、何もしません。そのようなオペランドでもっと。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.