GNUインストールを使用してディレクトリを再帰的にインストールする

GNUインストールを使用してディレクトリを再帰的にインストールする

以下のファイルツリーがある場合は、/usr/share/appname/GNUとモードを使用してどのようにinstall再帰的にインストールしますか644

私は最初に必要だと仮定しますinstallディレクトリの作成-dディレクトリ権限が異なる必要があるからです( 755)。

もちろん、これは解決策ではありません。

  local dir file
  for dir in "${dirs_with_files[@]}"; do
    for file in "$srcdir/$dir"/*; do
      # install fails if given a directory, so check:
      [[ -f $file ]] && install -Dm644 -t "$dir" "$file"
    done
  done

答え1

ファイルを再帰的にインストールする魔法の注文はありませんinstall。おそらくこの場合、最高のツールではないでしょう。ファイルとディレクトリ構造のコピーを使用してから回復モードをinstall使用することをお勧めします。cpchmod

答え2

まずディレクトリツリーを作成し、次の関数に示すようにファイルをコピーします。

#!/usr/bin/env bash
# Install directory
# returns 1 on error
# $1: Source directory
# $2: Target directory
_install_directory() {
    local _src="${1}" \
          _dest="${2}" \
          _path=()
    # Directory does not exist
    [ ! -d "${_src}" ] && \
      return 1
    while IFS="" \
            read -r \
                 _path; do
        [ -d "${_dest}/${path}" ] || \
          mkdir -m 0755 \
                -p \
                "${_dest}/${path}" || \
            return 1
    done <<<$(find "${_src}" \
                   -type d \
                   -printf '%P\n')
    # files
    while IFS="" \
            read -r \
                 _path; do
        [ -z "${_path}" ] && \
          continue
        install -m 0644 \
                "${_src}/${_path}" \
                "${_dest}/${_path}" || \
          return 1
    done <<<$(find "${_src}" \
                   -type f \
                   -printf '%P\n')

    # symlinks
    while IFS= \
            read -r \
                 _path; do
        [ -z "${_path}" ] && \
          continue
        cp -fPT \
           "${_dir}/${_path}" \
           "${_dest}/${_path}" || \
          return 1
    done <<<$(find "${_src}" \
                   -type l \
                   -printf '%P\n')
}

_src="${1}"
_dest="${2}"
_install_directory "${_src}" \
                   "${_dest}"

関連情報