所以我有一个回购协议,其中包含我的一些配置文件我正在尝试创建一个makefile
将它们安装在主目录中。我遇到的问题是,当我直接在 bash 中运行以下命令时
install -m 755 -d ~/path/to/dotfilesDir/ ~/
似乎什么也没发生
install -m 755 ~/path/to/dotfilesDir/{file1,file2,...} ~/
按预期工作。
为什么第一个(更简单、更干净)的解决方案不起作用?
答案1
从 @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 d
offind
和找到一种方法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/{}" \\;'
答案2
从一看手册页,似乎install
不会做你想做的事。
事实上,概要部分指示了该形式的用法:
install [OPTION]... -d DIRECTORY...
后来,手册页显示:
-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 "{}" ~/' +
答案3
将 src 文件夹及其中的文件复制到 dst 但我认为安装不支持递归文件夹复制。
install -D src/* -t dst