GNU cpおよびmvの-Tオプションの付加価値は何ですか?


26

一部のGNU Coreutilsコマンドに-T/--no-target-directoryオプションがあるのはなぜですか?.従来のUnixディレクトリ階層の(自己ドット)のセマンティクスを使用して、それが行うすべてのことを達成できるようです。

考慮:

cp -rT /this/source dir

この-Tオプションは、コピーがdir/sourceサブディレクトリを作成しないようにします。むしろ/this/sourceと識別されdir、コンテンツはそれに応じてツリー間でマッピングされます。そのため、たとえばにではなく、に/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/path識別されdirます。

現在のディレクトリがターゲットの場合は正常に機能します。

cp -r /this/tree/node/. . # node's children go to current dir

あなたが行うことができます何かがあるだけ-Tその存在を合理化することができ、それは?(ドットディレクトリを実装していないオペレーティングシステムのサポートに加えて、ドキュメントに記載されていない理論的根拠。)

上記のドットトリックは、GNU Infoドキュメントで言及されているのと同じ競合状態を解決しません-Tか?

回答:


29

あなたの.ディレクトリではなく、ファイルをコピーしているときのトリックにのみ使用することができます。この-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

この.トリック、ファイルをコピーするときに機能しますが、ベース名を同時に変更するときは機能しません!cp /path/to/file /target/dir/. 場合/target/dir/file存在し、ディレクトリである、あなたは同じ診断を入手します!しかし-T、競合状態なしに、ワンステップでそれなしではできないことを示しました。ファイルをコピーし、サブディレクトリに迂回せずに名前を変更します。
カズ

3
それは同じではありません- .あなたが話しているトリック/.sourceに追加することです
バーマー

21

元々設計されていたcp/ mv/ の問題lnは、2つのコマンドが1つになっている(copy tocopy into)ことです。

cp A B

いずれかであるBにAをコピーまたはBにAをコピーしB / AにコピーAかどうかに応じて)B存在し、(Bディレクトリへのシンボリックリンクである場合、よりバリエーション)ディレクトリかどうかです。

あいまいなので、それは悪いことです。そのため、GNUの実装には、それを回避するオプションが追加されています。

cp -T A B

関係なくAをBにコピーします。場合B存在し、ディレクトリである(あなたが合格しない限り、それは失敗します-r)。いずれにせよ、B にコピーするつもりだったときに、Aファイルが中に入ってしまうことはありません。BA

そして:

cp -t B A

コピーです。


UNIXの最初の哲学は、自分が何をしているのかを知っていると仮定することであり、喜んで自分の足で撃つことを可能にします。
レンネ

4
@Lenne、しかし、ここでは足で自分を撃つことを避ける方法を提供しません。cp A Bコマンドを実行する直前に誰かがBディレクトリまたはディレクトリへのシンボリックリンクを作成した場合、コマンドは意図したとおりには動作しません。そして、やることには[ -e B ] || [ -L B ] || cp A Bまだcp -Tn A Bない競合状態があります。
ステファンシャゼラス16年

6

-Tディレクトリが誤っ先のファイルである必要があります何のために存在している場合、障害を提供することができます。

$ mkdir mustbeafile
$ touch afile
$ cp -T afile mustbeafile
cp: cannot overwrite directory `mustbeafile' with non-directory
$ echo $?
1
$ cp afile mustbeafile
$ 

つまり、サブディレクトリへの予期しないコピーの成功の代わりに、警告と不適切な終了ステータスが発生し、スクリプトが中断し、人間がディレクトリがあるべきではない理由を検査する可能性があります1つになります。


0

また、コマンドを手動で入力する代わりにスクリプトで使用すると、フラグを使用する方がはるかに明確であり、意図しない効果のリスクが少なくなります。スクリプト内のパスにドットをパッチすると、あらゆる種類の予期しないいたずらが発生する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.