1つのコマンドで相対パスをコピーできますか?

1つのコマンドで相対パスをコピーできますか?

私はこれをあまりにも頻繁に実行するので、これを行う標準のUnixメソッドがあるかどうか疑問に思います。

% mkdir -p /TARGETDIR/relative/path/to
% cp ./relative/path/to/somefile /TARGETDIR/relative/path/to

つまり、コピーするだけではなく、somefile実際には/TARGETDIR全体をコピーしたいのです。相対パス

上記の2行よりも簡単な方法はありますか?

答え1

GNU coreutilsを使用する(非埋め込みLinux、Cygwin):

cp -p --parents path/to/somefile /TARGETDIR

POSIXツールの使用pax(残念ながら、多くのLinuxの基本インストールではこの機能が不足しています。)

pax -rw -pp relative/path/to/somefile /TARGETDIR

伝統に反対するものcpio:

find relative/path/to/somefile | cpio -p -dm /TARGETDIR

(最後のコマンドは、ファイル名に改行文字が含まれていないと仮定します。攻撃者がファイル名を選択できる場合は別の方法を使用するか、find … -print0 | cpio -0 …可能であればそれを使用してください。)

あるいは、これをシェルスクリプトまたは関数にすることもできます。

cp_relpath () {
  mkdir -p -- "$2/$(dirname -- "$1")"
  cp -Rp -- "$1" "$2/$(dirname -- "$1")"
}

答え2

man cp明らかにする--parents。はい、そう簡単です。

$ mkdir /tmp/myetc && cp --parents init.d/cron /tmp/myetc && find /tmp/myetc/
/tmp/myetc/
/tmp/myetc/init.d
/tmp/myetc/init.d/cron

関連情報