Estaba esperando:
cp -R src/prog.js images/icon.jpg /tmp/package
produciría una estructura simétrica en el directorio de destino:
/tmp
|
+-- package
|
+-- src
| |
| +-- prog.js
|
+-- images
|
+-- icon.jpg
pero, en cambio, ambos archivos se copian en / tmp / package. Una copia plana. (Esto está en OSX).
¿Existe una función bash simple que pueda usar para copiar todos los archivos, incluidos los archivos especificados con comodines (por ejemplo, src / *. Js) en el lugar que les corresponde dentro del directorio de destino? Un poco como "para cada archivo, ejecutemkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")
", pero quizás un solo comando.
Este es un hilo relevante, lo que sugiere que no es posible. Sin embargo, la solución del autor no es tan útil para mí, porque me gustaría simplemente proporcionar una lista de archivos, comodines o no, y copiarlos todos en el directorio de destino. IIRC MS-DOS xcopy hace esto, pero parece que no hay equivalente para cp.
cp --parents
es una opción ilegal en OSX (BSD cp), perogcp
(GNU cp) funciona bien. Si aún no está en su sistema, utilicebrew install coreutils
. U tendrá muchas utilidades con prefijo g.cp -R --parents
yrsync -rR
copia relativamente tanto archivos como directorios.De una sola mano:
fuente
-C
opción para hacer el chdir por usted,tar cf - _files_ | tar -C /dest xf -
o algo así.Alternativamente, si eres de la vieja escuela, usa cpio:
Claramente, puede filtrar la lista de archivos al contenido de su corazón.
La opción '-p' es para el modo 'pass-through' (frente a '-i' para entrada o '-o' para salida). La '-v' es detallada (enumera los archivos a medida que se procesan). La '-m' conserva los tiempos de modificación. La '-B' significa usar 'bloques grandes' (donde los bloques grandes son 5120 bytes en lugar de 512 bytes); es posible que no tenga ningún efecto en estos días.
fuente
-print0
con la combinación de--null
opción para que no se rompa con caracteres especiales y tal:find . -print0 | cpio -pvdmB --null /target
cpio
en esta tarea. Estoy de acuerdo en que se deben usar las opciones-print0
y-null
, de lo contrario, en algún momento, alguien le dará algunas carpetas con 'caracteres especiales' (espacios, lo más probable) y algo sucederá. No es que esté hablando por experiencia personal, pero puede intentar hacer una copia de seguridad de un montón de archivos y terminar con la mitad de ellos respaldados debido a que hay espacios en los nombres de los archivos. (Está bien, estoy hablando por experiencia personal.)cpio
como se muestra si los nombres de archivo contienen líneas nuevas; entonces normalmente termina con un mensaje de error sobre dos (o más) nombres de archivo que no se encuentran para cada línea nueva en un nombre de archivo. (A veces, es posible que reciba menos mensajes, pero eso requiere un cuidado considerable al construir el caso de prueba). Cuando lo usécpio
, no había--null
opción; Las opciones de doble guión no formaban parte de las notaciones de opciones de SVR4 y el concepto de-print0
no estaba presente enfind
ninguna de las dos. Pero eso fue hace mucho tiempo (a mediados de los 90, por ejemplo, antes de que Linux alcanzara el dominio).xargs
en la mezcla - se divide en espacios en blanco - espacios en blanco, tabulaciones, nuevas líneas. OTOH, no estoy seguro de cómo o por qué harías eso. Elcpio
manual de GNU en el modo de salida es claro acerca de un nombre de archivo por línea. El manual de usuario del SVR4 (impreso en 1990) es más vago:cpio -o
(modo de copia) lee la entrada estándar para obtener una lista de nombres de ruta y copia esos archivos en la salida estándar junto con el nombre de ruta y la información de estado. Por lo tanto, existe la posibilidad de que haya roto nombres en espacios.La opción -R de rsync hará lo que esperas. Es una copiadora de archivos con muchas funciones. Por ejemplo:
Resultados de muestra:
fuente
rsync por supuesto! tutorial aquí. y aquí
O al unísono
fuente
Tratar...
así que por lo que estabas haciendo originalmente ...
o
fuente
echo
ni$v
aquí. Además, este método fallará si el directorio correspondiente no existe en el destino.