Problema com o comando install para copiar um diretório inteiro

11

Então, eu tenho um repo com alguns dos meus arquivos de configuração e estou tentando criar um makefile para instalá-los no homedir. O problema que tenho é que quando eu corro o seguinte comando direto no bash

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

aparentemente nada acontece enquanto

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

funciona como pretendido.

Por que a primeira solução (mais fácil e mais limpa) não funciona?

    
por nathdwek 01.11.2014 / 23:28

2 respostas

7

De uma olhada na página man , parece que install não fará o que você quer.

De fato, a seção Sinopse indica o uso do formulário:

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

e mais tarde, a página man diz:

-d, --directory
treat all arguments as directory names; create all components of the specified directories

Portanto, parece-me que o objetivo dessa opção é poder instalar uma estrutura de diretório complicada (mas vazia) à la mkdir -p ... .

Você pode realizar o que quiser com um loop:

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

Ou, se houver muitos níveis em /path/to/DotFiles/dir , você poderá usar find :

find /path/to/DotFiles/dir/ -type f -exec 'install -m 755 "{}" ~/' +
    
por 02.11.2014 / 00:08
3

A partir da resposta do @Joseph R., esta é a minha solução para que funcione com o find, já que não consegui fazer o seu comando funcionar. (Eu não acho que sim, por causa das regras que se aplicam ao \+ : não pode haver nada após o elemento {} .) (Eu não pude comentar. Todo este parágrafo pode realmente ser removido.)

Para copiar todos os arquivos no mesmo diretório (aqui target/directory ):

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

-D não é obrigatório aqui, apenas criará os diretórios não existentes no destino.

Para copiar toda uma hierarquia de diretórios e seus arquivos (isso omitirá os diretórios vazios) a partir de onde você está atualmente:

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

Como dito, isso irá recriar a árvore a partir de $PWD . Além disso, se você precisar copiar o diretório vazio, poderá encontrar uma maneira de usar o -type d de find e install -d .

Assim, para copiar a árvore, a partir de um diretório que não seja $PWD :

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

Observe como parent/directory não é copiado.

Extra

Para aqueles que usam shell/fish , aqui está a linha que faz o mesmo:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \;'
    
por 17.11.2017 / 20:46