Uso del terminal Mac OS X para copiar una selección de carpetas a una nueva ubicación, con comportamiento de combinación

Uso del terminal Mac OS X para copiar una selección de carpetas a una nueva ubicación, con comportamiento de combinación

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 -ropció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 findo, aún más simple,golpe globular:

cp -rv foo/2011* bar/

Si hay archivos y carpetas cuyo nombre comienza con 2011, use findy su -execopció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

información relacionada