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/.
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.
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).
Respostas:
Se você deseja copiar o conteúdo da pasta recursivamente (lançará 1 erro, alternativas abaixo):
Um pouco mais hacky, mas funciona em subdiretórios não vazios:
Outro oneliner:
Ou recursivo:
fonte
find
código: Dxargs
ou-exec
. Não há necessidade degrep
uso! -name "$TARGETDIR"
ou similar. Você tem aspas sem igual$file
. Eu não acho que uma recursivacp
funcione da maneira que você pretende, exceto seu primeiro comando.Supondo
target
é o nome do subdiretório de destino, se o seu shell for bash:No ksh, você pode fazer diretamente
cp -r !(target) target/
.No zsh, você pode fazer
setopt ksh_glob
issocp -r !(target) target/
. Outra possibilidade ésetopt extended_glob
entãocp -r ^target target/
.fonte
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.
fonte
Isso funcionará para você?
Se você pretendia mover em vez de copiar tudo no diretório atual para um subdiretório, você poderia fazer:
fonte
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
:fonte
Isso diz no arquivo dirCopy.sh
execute-o como "sh dirCopy.sh" no seu console
fonte
ls
:for file in *
. Não há necessidade de retalhos - use$()
. Não há necessidade de reticências (ou$()
) ao redor docp
comando (que produzirá uma mensagem de erro).