bash - todos - mover varios archivos en linux
Bash: Copia los archivos nombrados recursivamente, preservando la estructura de la carpeta (6)
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 por comodín (por ejemplo, src / *. Js) en el lugar que les corresponde dentro del directorio de destino? Un poco como "para cada archivo, ejecute mkdir -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. La solución del autor no es tan útil para mí, porque me gustaría simplemente proporcionar una lista de archivos, comodín o no, y tenerlos todos copiados en el directorio de destino. IIRC MS-DOS xcopy hace esto, pero parece que no hay equivalente para cp.
¿Has probado usando la opción --parents? No sé si OS X lo admite, pero eso funciona en Linux.
cp --parents src/prog.js images/icon.jpg /tmp/package
Si eso no funciona en OS X, prueba
rsync -R src/prog.js images/icon.jpg /tmp/package
como se sugirió.
Alternativamente, si eres de la vieja escuela, usa cpio:
cd /source;
find . -print | cpio -pvdmB /target
Claramente, puedes filtrar la lista de archivos al contenido de tu corazón.
La opción ''-p'' es para el modo ''paso'' (contra ''-i'' para la entrada o ''-o'' para la salida). El ''-v'' es detallado (enumera los archivos a medida que se procesan). El ''-m'' conserva los tiempos de modificación. El ''-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.
De una sola mano:
tar cf - <files> | (cd /dest; tar xf -)
Tratar...
for f in src/*.js; do cp $f /tmp/package/$f; done
entonces para lo que estabas haciendo originalmente ...
for f in `echo "src/prog.js images/icon.jpg"`; do cp $f /tmp/package/$f; done
o
v="src/prog.js images/icon.jpg"; for f in $v; do cp $f /tmp/package/$f; done
rsync por supuesto! tutorial aquí. y aquí
O unison
La opción -R de rsync hará lo que esperas. Es una copiadora de archivos con muchas funciones. Por ejemplo:
$ rsync -Rv src/prog.js images/icon.jpg /tmp/package/
images/
images/icon.jpg
src/
src/prog.js
sent 197 bytes received 76 bytes 546.00 bytes/sec
total size is 0 speedup is 0.00
Resultados de muestra:
$ find /tmp/package
/tmp/package
/tmp/package/images
/tmp/package/images/icon.jpg
/tmp/package/src
/tmp/package/src/prog.js