GNU cpとmvの-Tオプションの追加値は何ですか?

GNU cpとmvの-Tオプションの追加値は何ですか?

一部の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.cdir/source/foo.c

ただし、-T次のオプションを使用せずにこれを簡単に実行できます。

cp -r /this/source/. dir  # Probably worked fine since dawn of Unix?

意味的には、末尾のポイントコンポーネントはの下位にコピーされますが、dirもちろんその「サブ」はすでに存在し(したがって生成される必要はありません)、実際にはそれ自体であるため、として識別するdir効果があります。/this/pathdir

現在のディレクトリがターゲットの場合、これはうまく機能します。

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つのコマンドがmv1つに含まれていることです(lnにコピーそしてにコピー)。

cp A B

またはAをBにコピーまたはAをBにコピーAをB/AにコピーB)は、Bが存在し、ディレクトリであるかどうかによって異なります(Bがディレクトリへのシンボリックリンクである場合は、より多くのバリエーションが可能です)。

あいまいだからこれは悪いしたがって、GNU実装にはこの問題を解決するためのオプションが追加されました。

cp -T A B

AをBにコピーにもかかわらず。B存在し、ディレクトリの場合は失敗します(渡さない限り-r)。とにかく、コピーしようとするとA内部にファイルが残らないでしょう。BA到着雨。

そして:

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

使用フラグもより明確になり、コマンドを手動で入力するよりも、スクリプトでコマンドを使用すると意図しない結果が発生するリスクが軽減されます。スクリプトのパスにポイントをパッチすると、あらゆる種類の予期しない問題が発生する可能性があります。

関連情報