一部の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
答え2
cp
//元のデザインの問題は、2つのコマンドがmv
1つに含まれていることです(ln
にコピーそしてにコピー)。
cp A B
またはAをBにコピーまたはAをBにコピー(AをB/AにコピーB
)は、Bが存在し、ディレクトリであるかどうかによって異なります(Bがディレクトリへのシンボリックリンクである場合は、より多くのバリエーションが可能です)。
あいまいだからこれは悪いしたがって、GNU実装にはこの問題を解決するためのオプションが追加されました。
cp -T A B
AをBにコピーにもかかわらず。B
存在し、ディレクトリの場合は失敗します(渡さない限り-r
)。とにかく、コピーしようとするとA
内部にファイルが残らないでしょう。B
A
到着雨。
そして:
cp -t B A
~であるにコピー。
答え3
-T
ターゲットファイルのディレクトリが正しく存在しない場合、エラーが発生する可能性があります。
$ mkdir mustbeafile
$ touch afile
$ cp -T afile mustbeafile
cp: cannot overwrite directory `mustbeafile' with non-directory
$ echo $?
1
$ cp afile mustbeafile
$
つまり、誤ってサブディレクトリに正常にコピーするのではなく、警告と無効な終了ステータスが表示され、スクリプトが中断される可能性があり、存在しないディレクトリがある理由を手動で確認するだけです。
答え4
使用フラグもより明確になり、コマンドを手動で入力するよりも、スクリプトでコマンドを使用すると意図しない結果が発生するリスクが軽減されます。スクリプトのパスにポイントをパッチすると、あらゆる種類の予期しない問題が発生する可能性があります。