web-dev-qa-db-ja.com

1つのコマンドでrelpathをコピーできますか?

私はこれを頻繁に行っているので、標準的なUnixの方法があるかどうか疑問に思います。

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

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

上記の2ライナーよりも簡単な方法はありますか?

2
kjo

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
3
poige