POSIXlyでは、次pax
の-l
オプションを使用して読み取り+書き込みモードで使用します。
pax -rwlpe -s /A/B/ dirA .
(-pe
GNU 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 -> AA
dirA
foo -> BA
dirB
また、あなたは同じですが、その内容に格納された任意のファイルパスを行いたい場合$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
。
pax
POSIXがtar
and 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")
pax
FreeBSDののように、cp -a
シンボリックリンクをハードリンクしないことに注意してください。