安装命令复制整个目录时出现问题


16

所以我有一些配置文件的仓库,我试图创建一个makefile将它们安装在homedir中。我的问题是当我直接在bash中运行以下命令时

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

似乎什么也没发生

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

按预期工作。

为什么第一个(更简便)的解决方案不起作用?



我只是将cp与-r一起使用。我真的不明白为什么安装不像cp一样具有-r选项。
ibrahim

Answers:


7

手册页上看,似乎install并不能满足您的要求。

实际上,“概要”部分指示了以下形式的用法:

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

稍后,手册页显示:

-d,--
directory将所有参数视为目录名;创建指定目录的所有组件

因此,在我看来,此选项的重点是能够安装复杂的(但为空)目录结构àla 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 2014年

@nathdwek对。这样,您可以使用install -m 755 -d ~/foo/bar/baz
Joseph 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
Josh

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/{}" \\;'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.