Problema con il comando install per copiare un'intera directory


16

Quindi ho un repository con alcuni dei miei file di configurazione e sto provando a crearne uno makefileper installarli in homedir. Il problema che ho è che quando eseguo il seguente comando direttamente in bash

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

apparentemente nulla accade mentre

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

funziona come previsto.

Perché la prima soluzione (più semplice e pulita) non funziona?



Ho appena usato cp con -r. Non capisco davvero perché install non abbia l'opzione -r come ha cp.
ibrahim,

Risposte:


7

Da uno sguardo alla pagina man , sembra che installnon farà ciò che vuoi.

Infatti, la sezione Sinossi indica un uso del modulo:

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

e più tardi, la pagina man dice:

-d, --directory
tratta tutti gli argomenti come nomi di directory; creare tutti i componenti delle directory specificate

Quindi mi sembra che il punto di questa opzione sia di poter installare una struttura di directory complicata (ma vuota) à la mkdir -p ....

Puoi realizzare ciò che vuoi con un ciclo:

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

Oppure, se ci sono molti livelli sotto /path/to/DotFiles/dir, puoi usare find:

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

Crea tutti i componenti delle directory specificate = Crea i sottodirectory ma non i file?
nathdwek,

@nathdwek Right. In questo modo puoi creare una struttura di directory complessa (scheletro) sotto, diciamo, la tua directory home usandoinstall -m 755 -d ~/foo/bar/baz
Joseph R.

1
-exec 'install -m 755 "{}" ~/' +non funzionerà, almeno non su certe versioni (tutte? più?) di Linux. Può funzionare su OSX o qualcosa del genere. Usare qualcosa del genere è piuttosto semplice se si desidera un oneliner: 1. creare directory ricorsive: for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done2. creare file ricorsivi:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
Josh M.

6

A partire dalla risposta di @Joseph R., questa è la mia soluzione per farlo funzionare con find, poiché non ho potuto far funzionare il suo comando. (Non credo, a causa delle regole che si applicano a \+: non può esserci nulla dopo l' {}elemento.) (Non ho potuto commentare. L'intero paragrafo può essere effettivamente rimosso.)

Per copiare tutti i file nella stessa identica directory (qui target/directory):

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

-D non è obbligatorio qui, creerà semplicemente le directory non esistenti sulla destinazione.

Per copiare un'intera gerarchia di directory e i suoi file (questo ometterà le directory vuote) a partire da dove ti trovi attualmente:

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

Come detto, questo ricrea l'albero a partire da $PWD. Inoltre, se è necessario copiare la directory vuota, su potrebbe trovare un modo utilizzando il -type ddi finde install -d.

Quindi, per copiare l'albero, partendo da una directory che non è $PWD:

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

Nota come parent/directorynon viene copiato.

Extra

Per quelli che usano shell/fish, ecco la linea che fa lo stesso:

fish -c 'cd parent/directory; and find directory/tree/to/copy -type f -exec install -Dm 755 "{}" "target/directory/{}" \\;'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.