varios todos renombrar pegar otro opt mover los eliminar directorio desde copiar carpeta archivos bash shell

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



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