Tengo una carpeta 'foo' que contiene muchas subcarpetas, por ejemplo
foo
|---20101
|---20102
|---20103
|---20111
|---20112
|---20113
Hay mucho más que esto, pero con suerte esto explica el escenario. Ahora quiero copiar todas las carpetas de esta carpeta que comienzan con '2011' en un hermano de 'foo' llamado 'bar'. Sin embargo, la 'barra' ya contiene algunas carpetas con el mismo nombre.
bar
|---20111
|---20113
|---20114
Los contenidos de la carpeta de origen y de destino deben fusionarse. Tenga en cuenta que el script también deberá crear una carpeta bar/20112, ya que no existe.
Soy nuevo en las secuencias de comandos de Mac Terminal y logré buscar las carpetas correctas
foo>ls | grep ^2011
Lo que enumera las carpetas correctas, pero no tengo idea de cómo canalizarlas a una operación de copia adecuada.
Respuesta1
El comando de copia es cp
. Si le asigna la -r
opción (recursiva), hará exactamente lo que desea: copiará archivos en carpetas existentes y creará nuevas carpetas cuando falte la carpeta de destino.
Sin embargo,nunca debes analizar la salida dels
, deberías usar find
o, aún más simple,golpe globular:
cp -rv foo/2011* bar/
Si hay archivos y carpetas cuyo nombre comienza con 2011
, use find
y su -exec
opción que aplicará cualquier comando que le dé a todo lo encontrado por find
(denominado {}
):
find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;
En este caso específico, no hay razón para guardar el resultado de un comando y pasarlo a cp
. Sin embargo, esto a veces es necesario, así que así es como se hace. En general, la salida de un comando se puede dar como entrada para otro comando si se coloca entre comas invertidas o $()
.
cp -rv `find foo/ -type d -name "2011*"` bar/
o
cp -rv $(find foo/ -type d -name "2011*") bar/
Alternativamente, puede recorrer los resultados:
for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done
Esto se vuelve más complicado si los nombres de sus archivos/carpetas pueden contener caracteres especiales o nuevas líneas y similares, en ese caso debería hacer algo como esto:
find foo/ -type d -name "2011*" | while IFS= read -r dir; do
cp -rv "$dir" bar/;
done