web-dev-qa-db-ja.com

ディレクトリ全体をコピーするインストールコマンドの問題

だから私はいくつかの config files を含むリポジトリを持っているので、makefileを作成してホームディレクトリにインストールしようとしています。私が持っている問題は、bashで次のコマンドを直接実行すると

install -m 755 -d ~/path/to/dotfilesDir/ ~/

一見何も起こらない

install -m 755 ~/path/to/dotfilesDir/{file1,file2,...} ~/

意図したとおりに機能します。

最初の(より簡単でよりクリーンな)ソリューションが機能しないのはなぜですか?

16
nathdwek

man page を見ると、installは期待どおりに動作しないようです。

実際、「概要」セクションは次の形式の使用法を示しています。

install [OPTION]... -d DIRECTORY...

その後、manページには次のように書かれています。

-d、-directory
すべての引数をディレクトリ名として扱います。指定されたディレクトリのすべてのコンポーネントを作成します

したがって、このオプションのポイントは、複雑な(ただし空の)ディレクトリ構造mkdir -p ...をインストールできるようにすることだと私には思われます。

あなたはループであなたが望むものを達成することができます:

for file in /path/to/DotFiles/dir/*;do
    install -m 755 "$file" ~/
done

または、/path/to/DotFiles/dirの下に多くのレベルがある場合は、findを使用できます。

find /path/to/DotFiles/dir/ -type f -exec 'install -m 755 "{}" ~/' +
7
Joseph R.

@Joseph R.の回答から始めて、これはfindでコマンドを機能させるための私の解決策です。彼のコマンドを機能させることができなかったからです。 (\+に適用される規則のため、そうではないと思います:{}要素の後には何もない可能性があります。)(コメントできませんでした。この段落全体は実際に削除できます。 )

すべてのファイルをまったく同じディレクトリにコピーするには(ここではtarget/directory):

find directory/to/copy -type f -exec install -Dm 755 "{}" "target/directory" \;

-Dはここでは必須ではなく、存在しないディレクトリをターゲットに作成するだけです。

ディレクトリ階層全体とそのファイル(空のディレクトリは省略されます)を現在の場所からコピーするには、次のようにします。

find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;

言ったように、これは$PWDから始まるツリーを再作成します。また、空のディレクトリをコピーする必要がある場合、onはfindおよび-type dinstall -dを使用して方法を見つけることができます。

したがって、ツリーをコピーするには、$PWDではないディレクトリから開始します。

(cd parent/directory && find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;)

parent/directoryがコピーされないことに注意してください。

追加

Shell/fishを使用している人のために、これは同じことをする行です:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
6
Vrakfall