`mkdir -p BASE/a/b/c && cp -a -t BASE/a/b/c /a/b/c/d`の代わりに「標準」の単一コマンドを使用しますか?

`mkdir -p BASE/a/b/c && cp -a -t BASE/a/b/c /a/b/c/d`の代わりに「標準」の単一コマンドを使用しますか?

コマンドの順序

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に限定されているようです。 :(

関連情報