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


16

だから私は私の設定ファイルのいくつかとリポジトリを持っていると私はmakefilehomedirにそれらをインストールするために作成しようとしています。私が抱えている問題は、bashで次のコマンドを直接実行すると

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

一見何も起こらない

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

意図したとおりに動作します。

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



cpに-rを付けて使用しました。なぜcpのような-rオプションがインストールされないのか、私は本当に理解していません。
イブラヒム

回答:


7

マニュアルページを見ると、install望んでいることはできないようです。

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

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 "{}" ~/' +

指定されたディレクトリのすべてのコンポーネントを作成する=ファイルではなくサブディレクトリを作成しますか?
nathdwek 14年

@nathdwekそうです。あなたが言う、下の複合体(スケルトン)のディレクトリ構造を作成することができます。この方法で、使用して自分のホームディレクトリinstall -m 755 -d ~/foo/bar/baz
ジョセフ・R.

1
-exec 'install -m 755 "{}" ~/' +少なくとも特定の(すべて?ほとんど?)バージョンのLinuxでは動作しません。OSXなどで動作する場合があります。あなたはonelinerをしたい場合は、このようなものを使用することはかなり簡単です:1.ディレクトリを再帰的作成:for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2.再帰的なファイルを作成しますfor f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
ジョシュ・M.

6

@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。また、空のディレクトリをコピーする必要がある場合は、-type dof findおよびを使用する方法を見つけることができますinstall -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/{}" \\;'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.