これら 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 は診断メッセージを標準エラーに書き込み、そのようなオペランドに対してそれ以上何もしません。 .