私はこれを頻繁に行っているので、標準的なUnixの方法があるかどうか疑問に思います。
% mkdir -p /TARGETDIR/relative/path/to
% cp ./relative/path/to/somefile /TARGETDIR/relative/path/to
つまり、somefile
を/TARGETDIR
にコピーするだけではなく、実際にはその全体をコピーしたい相対パス。
上記の2ライナーよりも簡単な方法はありますか?
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")"
}
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