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?


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

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/.


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.


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/

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

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


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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.