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.