Así que tengo un repositorio con algunos de mis archivos de configuración y estoy tratando de crear uno makefile
para instalarlos en el homedir. El problema que tengo es que cuando ejecuto el siguiente comando directamente en bash
install -m 755 -d ~/path/to/dotfilesDir/ ~/
aparentemente no pasa nada mientras
install -m 755 ~/path/to/dotfilesDir/{file1,file2,...} ~/
Funciona según lo previsto.
¿Por qué no funciona la primera solución (más fácil y limpia)?
Respuestas:
De un vistazo a la página del manual , parece que
install
no hará lo que quiere.De hecho, la sección Sinopsis indica un uso del formulario:
y luego, la página del manual dice:
Entonces, me parece que el objetivo de esta opción es poder instalar una estructura de directorio complicada (pero vacía) a la
mkdir -p ...
.Puedes lograr lo que quieres con un bucle:
O, si hay muchos niveles por debajo
/path/to/DotFiles/dir
, puede usarfind
:fuente
install -m 755 -d ~/foo/bar/baz
-exec 'install -m 755 "{}" ~/' +
no va a funcionar, al menos no en ciertas versiones (¿todas? ¿La mayoría?) de Linux. Puede funcionar en OSX o algo así. Usar algo como esto es bastante sencillo si desea un elemento de línea: 1. cree directorios recursivos:for d in $(find . -type d); do install -d --mode 755 "$d" "../install-test/$d"; done
2. cree archivos recursivos:for f in $(find . -type f); do install -D --mode 644 "$f" ../install-test/; done
A partir de la respuesta de @Joseph R., esta es mi solución para que funcione con find, ya que no pude hacer que su comando funcione. (No creo que lo haga, debido a las reglas que se aplican a
\+
: no puede haber nada después del{}
elemento). (No pude comentar. Todo este párrafo se puede eliminar realmente).Para copiar todos los archivos en el mismo directorio exacto (aquí
target/directory
):-D
no es obligatorio aquí, solo creará los directorios no existentes para el destino.Para copiar una jerarquía de directorios completa y sus archivos (esto omitirá los directorios vacíos) comenzando desde donde se encuentra actualmente:
Como se dijo, esto recreará el árbol a partir de
$PWD
. Además, si necesita copiar el directorio vacío, en podría encontrar una manera usando el-type d
defind
yinstall -d
.Entonces, para copiar el árbol, comenzando desde un directorio que no es
$PWD
:Observe cómo
parent/directory
no se copia.Extra
Para aquellos que usan
shell/fish
, aquí está la línea que hace lo mismo:fuente