コマンドの順序
mkdir -p BASE/a/b/c && cp -a --target-directory=BASE/a/b/c /a/b/c/d
a/b/c
下にサブディレクトリを作成し、BASE
ディレクトリツリー/a/b/c/d
をにコピーしますBASE/a/b/c
。
1つの問題は、多くの反復が必要なため、エラーが発生することです。
これをカプセル化するために、シェル機能をロールアウトできます。たとえば、エラーチェック/処理のないスケッチは次のとおりです。
copytwig () {
local source=$1
local base=$2
local target=$base/$( dirname $source )
mkdir -p $target && cp -a --target-directory=$target $source
}
...しかし、これは「標準」Unixユーティリティを使用して実行できるかどうか疑問に思います(私は「Unixシステムで見つかる可能性が高いか、少なくともLinuxシステムで見つかる可能性がある」として「標準」を使用します)。
答え1
使用 pax
(強制POSIXユーティリティですが、一部のGNU / Linuxディストリビューションにはまだデフォルトでインストールされていません):
pax -s':^:BASE/:' -pe -rw /a/b/c/d .
(そして--target-directory
どちらも-a
標準cp
オプションではありません。これはGNU拡張です。)
-pe
(GNUに似ています-a
)を使用すると、ディレクトリコンポーネントpax
のメタデータ(時間、所有者、権限...)もコピーしようとします(BASE
メタデータはcreateを使用するのと同じですmkdir BASE
)。
答え2
ディレクトリ構造を維持するために--parents
スイッチを使用できます。cp
mkdir BASE && cp --parents -a --target-directory=BASE /a/b/c/d
編集:申し訳ありません。 Unixソリューションをリクエストしましたが、これはLinuxに限定されているようです。 :(