
以下を考慮してください。
/tmp$ mkdir -p src/{a,b} dst/dstsub; touch src/{a,b}/hello
/tmp$ tree src/ dst/
src/
├── a
│ └── hello
└── b
└── hello
dst/
└── dstsub
今走る
/tmp$ cp -r src/a/.. dst/dstsub/
src
GNU cpを使用すると、次のように==の内容src/a/..
がにコピーされますdst/dstsub
。
/tmp$ tree dst/
dst/
└── dstsub
├── a
│ └── hello
└── b
└── hello
ただし、Busyboxを使用してこの練習を繰り返すと、ターゲット構造が異なります。
/tmp$ rm -r dst/; mkdir -p dst/dstsub
/tmp$ busybox cp -r src/a/.. dst/dstsub/
/tmp$ tree dst/
dst/
├── a
│ └── hello
├── b
│ └── hello
└── dstsub
src
ここで、ソースディレクトリ==の内容がsrc/a/..
コピーされます。横にdst/dstsub/
代わりにターゲットディレクトリ存在するそれ。
標準テキストをお読みください。
cp -R [-H|-L|-P] [-fip] source_file... target
[...] cpユーティリティは、各ファイルをルートにするファイル階層の各ファイルをコピーする必要があります。ソースファイル名前付きターゲットパスへ:
もしターゲット既存のディレクトリが存在し、名前が付けられ、ファイル階層内の各ファイルに対応するターゲットパスの名前を関連付ける必要があります。ターゲット、一つ<スラッシュ>文字の場合ターゲット次に終わらない<スラッシュ>および含まれているディレクトリに対するファイルのパス名ソースファイル。
ターゲットis はdst/dstsub/
スラッシュで終わる既存のディレクトリです。ソースファイルissrc/a/..
なので、それを含むディレクトリはisでsrc/a/
あり、それを含むディレクトリへの相対パス名はetc。であり../a
、これはBusyboxの動作と一致する宛先パス../b
etc。になります。dst/dstsub/../a
dst/dstsub/../b
ただし、削除するソースパスを最初に正規化すると..
削除されますsrc/
(または、むしろ生成されたときに発生するようにそれ自体がコピーされないsrc/.
ため、むしろ)。その結果、GNU cpの機能と一致するように見えるようなターゲットパスが生成されます。 (そうかはわかりませんが、一理のある説明のようです。)src
cp -r src dst
dst/src
dst/dstsub/./a
言及された唯一のことは..
(ピアツーピア)は特別です。標準テキストに表示される内容は次のとおりです。
2. もしソースファイルディレクトリタイプの場合は、次の手順を実行する必要があります。
b.もしソースファイルオペランドとして指定されておらず、ソースファイルはい指すまたはピアツーピア、cpはもはや何もしません。ソースファイル残りのファイルを処理し続けます。
..
含まれるパスはコマンドラインオペランドとして明示的に提供されるため、これは適用されません。さらに、オペランドは正確には存在しませんが、..
GNUとBusyboxの両方のソースディレクトリで..
同じ結果が得られます。
/tmp$ cd src/a/
/tmp/src/a$ cp -r .. /tmp/dst/dstsub/
..
標準は上記(または同等の動作)の正規化を許可しますか?どうすればいいですか?すべきいいえ完成した?それとも、GNU cpの動作や標準テキストの解釈に関連して私が欠けているものはありますか?