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

0

Eu tenho 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 como eu apenas copiai as pastas fo1 e fo2 para o novo local?

    
por Shan 08.11.2013 / 03:15

3 respostas

2

Use rsync :

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
    
por Radu Rădeanu 08.11.2013 / 09:18
1

A melhor opção é usar globs e cp com sua opção --parents . No seu caso:

cp -nvr --parents -- Main_Dir/*/fo{1,2} Destination/

Olhe:

gniourf@somewhere$ mkdir -pv Main_Dir/Subdir{1..3}/f{o{1,2},03}
mkdir: created directory 'Main_Dir'
mkdir: created directory 'Main_Dir/Subdir1'
mkdir: created directory 'Main_Dir/Subdir1/fo1'
mkdir: created directory 'Main_Dir/Subdir1/fo2'
mkdir: created directory 'Main_Dir/Subdir1/f03'
mkdir: created directory 'Main_Dir/Subdir2'
mkdir: created directory 'Main_Dir/Subdir2/fo1'
mkdir: created directory 'Main_Dir/Subdir2/fo2'
mkdir: created directory 'Main_Dir/Subdir2/f03'
mkdir: created directory 'Main_Dir/Subdir3'
mkdir: created directory 'Main_Dir/Subdir3/fo1'
mkdir: created directory 'Main_Dir/Subdir3/fo2'
mkdir: created directory 'Main_Dir/Subdir3/f03'
gniourf@somewhere$ tree Main_Dir/
Main_Dir/
|-- Subdir1
|   |-- f03
|   |-- fo1
|   '-- fo2
|-- Subdir2
|   |-- f03
|   |-- fo1
|   '-- fo2
'-- Subdir3
    |-- f03
    |-- fo1
    '-- fo2

12 directories, 0 files
gniourf@somewhere$ mkdir Destination
gniourf@somewhere$ cp -nvr --parents -- Main_Dir/*/fo{1,2} Destination/
Main_Dir -> Destination/Main_Dir
Main_Dir/Subdir1 -> Destination/Main_Dir/Subdir1
'Main_Dir/Subdir1/fo1' -> 'Destination/Main_Dir/Subdir1/fo1'
Main_Dir/Subdir2 -> Destination/Main_Dir/Subdir2
'Main_Dir/Subdir2/fo1' -> 'Destination/Main_Dir/Subdir2/fo1'
Main_Dir/Subdir3 -> Destination/Main_Dir/Subdir3
'Main_Dir/Subdir3/fo1' -> 'Destination/Main_Dir/Subdir3/fo1'
'Main_Dir/Subdir1/fo2' -> 'Destination/Main_Dir/Subdir1/fo2'
'Main_Dir/Subdir2/fo2' -> 'Destination/Main_Dir/Subdir2/fo2'
'Main_Dir/Subdir3/fo2' -> 'Destination/Main_Dir/Subdir3/fo2'
gniourf@somewhere$ tree Destination
Destination
'-- Main_Dir
    |-- Subdir1
    |   |-- fo1
    |   '-- fo2
    |-- Subdir2
    |   |-- fo1
    |   '-- fo2
    '-- Subdir3
        |-- fo1
        '-- fo2

10 directories, 0 files
gniourf@somewhere$ # Done!

Certifique-se de usar a opção --parent com a opção -r . A opção -v que usei é para que o comando seja detalhado (mostra o que está fazendo) e a opção -n é para no clobber para não sobrescrever arquivos existentes (eu uso isso um com muita frequência!).

Se você não quiser que o Main_Dir esteja no diretório, faça isso diretamente dentro do Main_Dir:

gniourf@somewhere$ mkdir -p Main_Dir/Subdir{1..3}/f{o{1,2},03} Destination
gniourf@somewhere$ cd Main_Dir/
gniourf@somewhere$ cp -nvr --parents -- */fo{1,2} ../Destination
Subdir1 -> ../Destination/Subdir1
'Subdir1/fo1' -> '../Destination/Subdir1/fo1'
Subdir2 -> ../Destination/Subdir2
'Subdir2/fo1' -> '../Destination/Subdir2/fo1'
Subdir3 -> ../Destination/Subdir3
'Subdir3/fo1' -> '../Destination/Subdir3/fo1'
'Subdir1/fo2' -> '../Destination/Subdir1/fo2'
'Subdir2/fo2' -> '../Destination/Subdir2/fo2'
'Subdir3/fo2' -> '../Destination/Subdir3/fo2'
gniourf@somewhere$ cd ..
gniourf@somewhere$ tree Destination/
Destination/
|-- Subdir1
|   |-- fo1
|   '-- fo2
|-- Subdir2
|   |-- fo1
|   '-- fo2
'-- Subdir3
    |-- fo1
    '-- fo2

9 directories, 0 files
gniourf@somewhere$ 
    
por gniourf_gniourf 08.11.2013 / 16:11
-1

No seu caso, é possível que as pastas fo1, fo2, fo3 tenham nomes diferentes, porque você não pode ter 3 pastas com o mesmo nome em uma pasta. Então, se parece com isso:

user@host:~/test/1# find
.
./main
./main/sub1
./main/sub1/fo3
./main/sub1/fo1
./main/sub1/fo2
./main/sub2
./main/sub2/fo6
./main/sub2/fo4
./main/sub2/fo5
./main/sub3
./main/sub3/fo9
./main/sub3/fo8
./main/sub3/fo7

... você pode copiar (apenas as subpastas) por:

user@host:~/test/1# cp -R main/*/fo* ../2/

Agora, ../2/ é assim:

user@host:~/test/1# cd ../2/
user@host:~/test/2# ls
fo1  fo2  fo3  fo4  fo5  fo6  fo7  fo8  fo9
    
por chaos 08.11.2013 / 08:40