これら 2 つの引数形式には根本的な違いがあります。そして、何が起こっているのかを理解することが重要です。
../foldersource/. で cp であるかどうかにかかわらず、引数は変更されずにコマンドに渡されます または rm または、他の何か。末尾のドットが、それが存在するディレクトリを単に指し示すという標準の Unix 規則とは異なる特別な、または固有のセマンティクスを持っているかどうかは、コマンド次第です。両方 rm と cp 特別なケースとして扱っているようです.
../foldersource/* で 引数はシェルによって最初に展開されます before コマンドは常に実行され、引数が渡されます。したがって、rm ../foldersource/* を見たことがない;展開されたバージョン ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1 が表示されます 等々。オペレーティング システムはコマンドに渡すことができる引数の数を制限しており、通常は数百しかないため、これは重要です。
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
bash を使用している場合 、 zsh 、 dotglob を使用できます * の意味を変更するオプション ドットで始まるファイルとディレクトリが含まれるようにします (yash dotglob もあります オプション;ただし、. が含まれます と .. 使いやすさを制限するグロブ展開で。 FIGNORE='@(.|..)' も参照してください ksh93 で ).
興味深いことに、cp -a source/. target/ 決してないことが保証されています コンポーネント target/source を作成します . (一方、cp -a source target/ target かどうかに応じて、2 つのいずれかを実行します。 もう存在している。詳細については、cp を使用して冪等の方法でフォルダーを再帰的にコピーする方法を参照してください。)
rm -rf source/*で削除する場合 source 内のファイルとディレクトリを削除しています ドットで始まらないもの (. )。 dotglob の対象 すでに述べた設定。ディレクトリ source は削除されません
rm -rf source/. で削除しようとすると 失敗します-他の人がすでに説明したように-POSIXは最後のコンポーネントが.であるパスの削除を禁止しているためです または .. .最も近いものは rm -rf source です source を削除します ドットで始まるかどうかに関係なく、ディレクトリとそのすべての内容 (. ).
rm -rf ../foldersource/. はできません なぜなら rm マニュアルに明示的に記載されているように、これは許可されていません:
最後のファイル名コンポーネントが '.' または '..' であるファイルを削除しようとすると、POSIX で義務付けられているようにプロンプトが表示されずに拒否されます。
と POSIX マニュアル man 1p rm
ファイル dot または dot-dot のいずれかがオペランドのベース名部分 (つまり、最終パス名コンポーネント) として指定されている場合、またはオペランドがルート ディレクトリに解決される場合、rm は診断メッセージを標準エラーに書き込み、そのようなオペランドに対してそれ以上何もしません。 .