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

13

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

Oguz Bilgic
fonte
Você quer dizer copiar ou mover?
Craig

Respostas:

12

Se você deseja copiar o conteúdo da pasta recursivamente (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
Lekensteyn
fonte
isso não funciona no caso de sub / não estar vazio -> sub será copiado para sub novamente, a menos que seja o que @Oguz queria.
Ok, finalmente estou satisfeito com o findcódigo: D
Lekensteyn
2
Seu segundo comando falha nos nomes de arquivos que incluem espaços. Use xargsou -exec. Não há necessidade de grepuso ! -name "$TARGETDIR"ou similar. Você tem aspas sem igual $file. Eu não acho que uma recursiva cpfuncione da maneira que você pretende, exceto seu primeiro comando.
Pausado até novo aviso.
Wohaa, perdeu uma cotação nos últimos códigos. Bom comentário Dennis, eu nunca pensou em usar -name neste caso :)
Lekensteyn
4

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

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

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

No zsh, você pode fazer setopt ksh_globisso cp -r !(target) target/. Outra possibilidade é setopt extended_globentão cp -r ^target target/.

Gilles 'SO- parar de ser mau'
fonte
2

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

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

alex
fonte
0

Isso funcionará para você?

cp -r * subdir/

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

mv * subdir/
karlphillip
fonte
isso não cuidar de diretórios não vazios
Acabei de testar e funcionou.
precisa saber é o seguinte
você precisa copiar recursivamente os diretórios não vazios, como o @Lekensteyn sugeriu.
-1

Isso copiará tudo, incluindo arquivos de ponto, e não incluindo o próprio diretório de destino, para o diretório de destino SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
ivern
fonte
2
Falha nos nomes de arquivos que incluem espaços.
Pausado até novo aviso.
-1

Isso diz no arquivo dirCopy.sh



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

execute-o como "sh dirCopy.sh" no seu console

Rahul
fonte
2
Não há necessidade de ls: for file in *. Não há necessidade de retalhos - use $(). Não há necessidade de reticências (ou $()) ao redor do cpcomando (que produzirá uma mensagem de erro).
Pausado até novo aviso.