Copiar subcarpetas específicas con estructura de directorios a una nueva carpeta


8

Tengo la siguiente estructura de directorios:

                Main_Dir
                   |
  -----------------------------------
  Subdir1       Subdir2       Subdir3
     |             |             |
 ---------     ---------     ---------
 |   |   |     |   |   |     |   |   |            
fo1 fo2 f03   fo1 fo2 f03   fo1 fo2 f03

Quiero copiar todos los subdirectorios ( Subdir1, Subdir2, Subdir3) en una nueva carpeta. Pero solo quiero copiar fo1y fo2carpetas en el nuevo lugar.

No estoy seguro de cómo podría hacerse.


Copiar todo, eliminar fo3?
ChuckCottrill el

Respuestas:


4

Si el árbol de directorios es más que sólo ..../f03puede utilizar este rsynccomando para copiar cada fo1Y fo2y excluyen cualquier otro directorio con el nombre fo*.

$ rsync -avz --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Cuando trato con este tipo de escenarios de copia, siempre uso rsyncy es --dry-runy --verbosemodifica para poder ver lo que va a hacer sin tener que copiar los archivos.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

Ejemplo

Carrera en seco.

$ rsync -avz --dry-run --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.
sending incremental file list
./

Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Si desea ver parte de rsyncla lógica interna de lo que se incluye / excluye, utilice el --verboseinterruptor.

$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
      Main_Dir/ new_Main_Dir/.

sending incremental file list
[sender] showing directory Subdir1/fo2 because of pattern fo[12]/
[sender] showing directory Subdir1/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir1/fo3 because of pattern fo*/
[sender] showing directory Subdir2/fo2 because of pattern fo[12]/
[sender] showing directory Subdir2/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir2/fo3 because of pattern fo*/
[sender] showing directory Subdir3/fo2 because of pattern fo[12]/
[sender] showing directory Subdir3/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir3/fo3 because of pattern fo*/
delta-transmission disabled for local transfer or --whole-file
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 201 bytes  received 51 bytes  504.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Si necesita excluir otras formas de directorios, puede agregar varias exclusiones.



0

Podrías probar algo como esto:

find Main_Dir -maxdepth 1 -mindepth 1 -type d | while IFS= read -r subdir; do
   mkdir -p new_dir/"$(basename $subdir)" && 
   cp -r "$subdir"/{fo1,fo2} new_dir/"$(basename $subdir)"/; 
done

El findcomando devuelve todos los subdirectorios directos de Main_Dir. basenamedevolverá el nombre del subdirectorio encontrado (por ejemplo, basename Main_Dir/Subdir1devoluciones Subdir1). A continuación, utiliza la cáscara de la expansión de llaves a la tipificación evitar fo1y fo2múltiples veces y copiarlos en el recién creado new_dir/$(basename $subdir)directorio.

En el caso específico en el que menciona donde solo hay directorios debajo Main_Diry donde no hay espacios o caracteres extraños en los nombres, puede simplificar lo anterior para

cd Main_Dir; for subdir in *; do 
  mkdir -p ../new_dir/$subdir && cp -rv $subdir/{fo1,fo2} ../new_dir/$subdir; 
done

0

Si la estructura de su directorio es exactamente como en su ejemplo (es decir, todos los foarchivos están en el mismo nivel):

mkdir -p New_Dir/{Subdir1,Subdir2,Subdir3}
for subdir in Subdir1 Subdir2 Subdir3;do
    cp -r Main_Dir/"$dir"/{fo1,fo2} New_Dir/"$dir"/
done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.