POSIXlyでは、次paxの-lオプションを使用して読み取り+書き込みモードで使用します。
pax -rwlpe -s /A/B/ dirA .
(-peGNU cpのように、コピーされるファイル(この場合はディレクトリのみ)のすべての可能な属性を保持します-a)。
今では、標準ではありますが、そのコマンドは必ずしも非常にポータブルではありません。
まず、多くのGNU / Linuxベースのシステムにはpax、デフォルトでは含まれていません(オプションのPOSIXユーティリティではありません)。
次に、いくつかの実装での多数のバグおよび不適合により、そのコードで多数の問題が発生します。
- バグのため、と組み合わせて
pax使用-rwlすると、Solaris 10は(少なくとも)動作しません-s。何らかの理由で、元のパスとコピーされたパスの両方に置換を適用するようです。そのため、上記では、link("dirB/file", "dirB/file")代わりにいくつかの処理を試みlink("dirA/file", "dirB/file")ます。
- FreeBSDでは、symlink
paxタイプのファイルのハードリンクを作成しません(POSIXで許可されている動作)。それだけでなく、置換をシンボリックリンクのターゲットに適用します(POSIXでは許可されていない動作です)。だから、例えばあるかどうシンボリックリンクはで、それはなりますの中で。foo -> AAdirAfoo -> BAdirB
また、あなたは同じですが、その内容に格納された任意のファイルパスを行いたい場合$srcや$dst、それが実現するために重要ですpax -rwl -- "$src" "$dst"の完全なディレクトリ構造を作成$src内部$dst(ディレクトリに存在してなければなりません)。例えば、場合$srcでfoo/bar、その後、$dst/foo/bar作成されます。
代わりに、$dstのコピーにしたい場合、$srcおそらく最も簡単な方法は次のとおりです。
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")
(上記の問題のほとんどを回避することもできますが、絶対パスが$dst改行文字で終わる場合は失敗します)。
今では、GNU / Linuxシステムでは何も役に立ちませんpax。
paxPOSIXがtarand cpioコマンドの機能をマージするために作成したことに注意してください。
cpioある歴史的 POSIX発明とは対照的に(1977から)Unixコマンド、およびGNUの実装では、ウェル(ないように存在するpaxもの)。そのため、それはもはや標準コマンドではありませんが(SUSv2にありました)、それでも非常に一般的であり、通常依存できる機能のコアセットがあります。
と同等のものはにpax -rwlなりますcpio -pl。しかしながら:
cpio 引数ではなく、stdinの入力ファイルのリストを取得します(改行文字で区切られているため、改行文字を含むファイル名はサポートされていません)
- すべてのファイルを指定する必要があります(一般的に、あなたはそれをの出力を供給
find(findとcpio)同じ人々によって共同開発されました)。
- メタデータは保持されません(一部の
cpio実装には保持するオプションがありますが、移植性はありません)。
だからcpio:
absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")
paxFreeBSDののように、cp -aシンボリックリンクをハードリンクしないことに注意してください。