web-dev-qa-db-ja.com

ファイルをコピーし、フルパスを保持します

フルパスでファイルを宛先フォルダーにコピーする必要があります。 Linux(Red Hat/Centos)では、次のように簡単に実行できます。

cp --parents /some/path/to/file /newdir

次に、宛先ディレクトリで次のようなものを取得します。

/newdir/some/path/to/file

AIX6.1でもまったく同じ機能が必要です。私はいくつかのことを試みましたが、まだ成功しませんでした。仕事をするための便利なコマンドのアイデアはありますか?

1
Luke

AIXのネイティブcpユーティリティ ご存知のとおり、--parentオプションは含まれていません。

1つのオプションは、 AIX Toolbox for Linux Applications ソフトウェアコレクションからrsyncをインストールして使用することです。また、(rsyncの依存関係として)poptRPMをインストールする必要があります。

次に、実行できます。

rsync -R /some/path/to/file /newdir/

最終的には/newdir/some/path/to/fileになります。


自家製のオプションとして、ksh93(配列サポート用)を使用してラッパー関数を記述し、動作をエミュレートすることができます。以下は、例として必要最低限​​の機能です。相対パスを使用してファイルをコピーすることを前提としており、次のオプションはサポートされていません。

relcp() {
  typeset -a sources=()
  [ "$#" -lt 2 ] && return 1
  while [ "$#" -gt 1 ]
  do
    sources+=("$1")
    shift
  done
  destination=$1

  for s in "${sources[@]}"
  do
    if [ -d "$s" ]
    then
        printf "relcp: omitting directory '%s'\n" "$s"
        continue
    fi

    sdir=$(dirname "$s")
    if [ "$sdir" != "." ] && [ ! -d "$destination/$sdir" ]
    then
      mkdir -p "$destination/$sdir"
    fi
    cp "$s" "$destination/$sdir"
  done

  unset sources s sdir
}
3
Jeff Schaller

AIX用のgnuツールキットであるAixToolsをインストールできます。 http://www.aixtools.net/index.php/coreutils

これには、あなたが知っていて大好きな他のすべてのツールの中でcpが含まれています。

0
Joe M

2段階のプロセスとして、最初にターゲットディレクトリを作成し(まだ存在しない場合)、次にファイルをコピーします(mkdirが成功した場合)。

dir=/some/path/to
mkdir -p "/newdir/$dir" && cp "$dir/file" "/newdir/$dir"

シェル関数として(単一のファイルのコピーのみを処理します):

cp_parents () {
    source_pathname=$1
    target_topdir=$2

    mkdir -p "$target_topdir/${source_pathname%/*}" && cp "$source_pathname" "$target_topdir/$source_pathname"
}

次に、

$ cp_parents /some/path/to/file /newdir
0
Kusalananda