私はこれをあまりにも頻繁に実行するので、これを行う標準の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