Copiando o conteúdo do diretório atual para um subdiretório

10

Como posso usar o terminal Linux para copiar tudo no diretório atual para um subdiretório?

    
por Oguz Bilgic 25.08.2010 / 19:41

6 respostas

8

Se você deseja copiar o conteúdo da pasta de forma recursiva (lançará 1 erro, alternativas abaixo):

cp -r * sub/

Um pouco mais hacky, mas funciona em subdiretórios não vazios:

TARGETDIR='targetdir here';cp -r 'find . -maxdepth 1 ! -name "$TARGETDIR"' "$TARGETDIR"

Outro oneliner:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

Ou recursivo:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
    
por 25.08.2010 / 19:48
3

Supondo que target seja o nome do subdiretório de destino, se o seu shell for bash:

shopt -s extglob
cp -r !(target) target/

Em ksh, você pode fazer diretamente cp -r !(target) target/ .

No zsh, você pode fazer setopt ksh_glob , em seguida, cp -r !(target) target/ . Outra possibilidade é setopt extended_glob then cp -r ^target target/ .

    
por 25.08.2010 / 21:38
2

Sugiro mover o diretório de destino para fora do diretório de origem e colocá-lo novamente; O mv é gratuito (se você for cuidadoso para não mudar para um sistema de arquivos diferente), a menos que você esteja esperando que outros processos interfiram / sejam interferidos.

A maioria das soluções postadas acima não funcionará se houver espaços em nomes de arquivos. Eu sugeriria usar variantes do find -print0 | xargs -0, ou encontrar -exec, etc.

    
por 25.08.2010 / 20:06
0

Isso funcionará para você?

cp -r * subdir/

Se você quisesse mover em vez de copiar tudo no diretório atual para um subdiretório, poderia fazer:

mv * subdir/
    
por 25.08.2010 / 19:46
-1

Isso copiará tudo, inclusive os arquivos de ponto, e não incluirá o próprio diretório de destino, no diretório de destino SUBDIR :

for i in 'ls -a | grep -Ev '^(SUBDIR|\.\.?)$''; do cp $i SUBDIR; done
    
por 25.08.2010 / 20:04
-1

Isso vai no arquivo say dirCopy.sh



for i in 'ls'
do
        if [ $i != "subDir" ]
        then
                'cp -r $i subDir'
        fi
done

execute como "sh dirCopy.sh" no seu console

    
por 25.08.2010 / 20:00