一部のGNU Coreutilsコマンドにこの-T/--no-target-directory
オプションがあるのはなぜですか?これが実行するすべての作業.
は、従来のUnixディレクトリ階層の(自己点)セマンティクスを使用して実装できるようです。
考えると:
cp -rT /this/source dir
この-T
オプションは、コピーがdir/source
サブディレクトリを作成するのを防ぎます。代わりに、コンテンツは/this/source
それに応じてツリー間で識別されマッピングされます。dir
たとえば、toの代わりに等に/this/source/foo.c
移動します。dir/foo.c
dir/source/foo.c
ただし、-T
次のオプションを使用せずにこれを簡単に実行できます。
cp -r /this/source/. dir # Probably worked fine since dawn of Unix?
意味的には、末尾のポイントコンポーネントはの下位にコピーされますが、dir
もちろんその「サブ」はすでに存在し(したがって生成される必要はありません)、実際にはそれ自体であるため、として識別するdir
効果があります。/this/path
dir
現在のディレクトリがターゲットの場合、これはうまく機能します。
cp -r /this/tree/node/. . # node's children go to current dir
あなたができることがありますか?ただ-T
その存在を合理化できるのか? (ドットディレクトリを実装していないオペレーティングシステムをサポートすることに加えて、これに関する理論的根拠は文書には記載されていません。)
上記のヒントは、GNU Infoドキュメントに記載されているのと同じ競合条件を解決しませんか-T
?
ベストアンサー1
あなたの.
トリックは、ファイルではなくディレクトリをコピーするときにのみ機能します。この-T
オプションはディレクトリとファイルに適用されます。これにより:
cp srcfile destfile
destfile
そして、コピーされる名前が付けられたディレクトリがすでにあります。destfile/srcfile
これはおそらく意図的なものではありません。だからあなたは
cp -T srcfile destfile
エラーが正しく発生します。
cp: cannot overwrite directory `destfile' with non-directory
この方法を試してみると、.
コピーは機能しません。
cp: cannot stat `srcfile/.`: Not a directory