Copiando subpastas específicas com estrutura de diretórios para uma nova pasta

8

Estou tendo a seguinte estrutura de diretórios:

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

Eu quero copiar todos os subdiretórios ( Subdir1 , Subdir2 , Subdir3 ) para uma nova pasta. Mas só quero copiar as pastas fo1 e fo2 no novo local.

Não tenho certeza de como isso pode ser feito.

    
por Shan 08.11.2013 / 02:33

4 respostas

4

Se a árvore de diretórios for mais do que apenas ..../f03 , você poderá usar esse comando rsync para copiar todos os fo1 & fo2 e excluir todos os outros diretórios com o nome fo* .

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

Ao lidar com esses tipos de cenários de cópia, sempre uso rsync e é --dry-run & --verbose alterna para que eu possa ver o que vai acontecer sem precisar copiar os arquivos.

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

Exemplo

Corrida a 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)

Se você quiser ver algumas das lógicas internas do rsync sobre o que está sendo incluído / excluído, faça uso da opção --verbose .

$ 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)

Se você precisar excluir outras formas de diretórios, poderá adicionar várias exclusões.

    
por 08.11.2013 / 14:10
3

Use rsync :

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
    
por 08.11.2013 / 13:17
0

Você pode tentar algo assim:

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

O comando find retorna todos os subdiretórios diretos de Main_Dir. basename retornará o nome do subdiretório encontrado (por exemplo, basename Main_Dir/Subdir1 returns Subdir1 ). Em seguida, use a expansão de chaves do shell para evitar digitar fo1 e fo2 várias vezes e copie-as para o diretório new_dir/$(basename $subdir) recém-criado.

No caso específico, você menciona onde existem apenas diretórios em Main_Dir e onde não há espaços ou caracteres estranhos nos nomes, você poderia simplificar o acima para

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

Se a sua estrutura de diretórios é exatamente como no seu exemplo (ou seja, todos os arquivos fo estão no mesmo nível):

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
    
por 08.11.2013 / 13:31