GNU/Linux >> Linux の 問題 >  >> Linux

/の間のコンテンツフォルダの差分コピー。および /* Linux では

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

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

../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 を使用している場合 、 zshdotglob を使用できます * の意味を変更するオプション ドットで始まるファイルとディレクトリが含まれるようにします (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 は診断メッセージを標準エラーに書き込み、そのようなオペランドに対してそれ以上何もしません。 .


Linux
  1. Linuxコンテナとイメージの違いは何ですか?

  2. Linuxでの「su」コマンドと「su-」コマンドの違い

  3. [[$ a ==Z*]]と[$a==Z *]の違いは?

  1. Linux –ユーザースペースとカーネルスペースの違いは?

  2. Linux の絶対パスと相対パスの違い

  3. Linux の機能と seccomp の違い

  1. LinuxでのSuspendとHibernateの違いは何ですか

  2. Windows – Qemu WindowsゲストとLinuxホスト間の共有フォルダー?

  3. 「ifconfig」コマンドと「ip」コマンドの違い