Estou migrando meu diretório pessoal de um sistema antigo para um novo, e o arquivo tar que criei contém tudo, incluindo arquivos ocultos, como .bashrc. No entanto, quando movo o conteúdo do tarball descompactado (que está em / tmp) para o meu novo diretório inicial, os arquivos ocultos não são copiados ( mv /tmp/home/rcook/* /home/rcook/
). Como faço para que o mv os mova?
Na verdade, acho que o problema não é com o mv, mas com o brilho do bash. Se eu fizer isso:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
Eu vejo isso:
a/:
. .. .foo
b/:
. .. bar
a/.foo
não se moveu. Então, como posso obter o curinga * para encontrar arquivos ocultos?
Sim, suponho que eu poderia descompactar o tarball diretamente no meu diretório pessoal, mas o tarball se descompacta home/rcook/...
e quero ter certeza de substituir o novo .bashrc
etc. pelas versões antigas e personalizadas e saber como encontrar e mover arquivos ocultos é uma habilidade que vale a pena. Sugestões?
Algumas respostas sugerem fazer algo parecido mv src/.* dest/
. No entanto, tentei isso nos meus diretórios de teste e obtive erros. Começando com:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
O que estou fazendo errado?
fonte
Respostas:
Você consegue fazer isso :
Você pode colocar
no seu
~/.bashrc
se você quiser que seja o padrão.Veja http://mywiki.wooledge.org/glob
Outra abordagem para copiar os arquivos de ponto:
Não use o padrão
..*
conforme ele corresponder..
(ponteiro para o diretório pai). Se houver arquivos cujo nome comece com dois pontos (..something
), use também o padrão..?*
.fonte
.
e..
são dirs especiais: respectivamente dir atual e dir pai . É apenas um aviso.shopt -s dotglob
Solução de melhor usomv home/rcook/* /home/rcook/
seguidos pormv home/rcook/.* /home/rcook/
. Isso fez o truque, embora eu desejasse ter seguido o link e lido primeiro sobre o modo dotglob. Isso teria me poupado um passo. 1zsh
, poderá usar oD
qualificador de globbing ou aGLOB_DOTS
opção de shell .Nas adições, você tem erros, mas o código ainda funciona. A única coisa a acrescentar é que você disse apenas para copiar os arquivos de ponto. Experimentar:
Você ainda receberá os erros para o. e .. entradas, o que é bom. Mas a mudança deve ter sucesso.
fonte
.hidden
arquivo que tinha explicitamente para resolver meu problema.|| :
(||
significa executar o seguinte em falso / erro,:
é o comando noop). Mas isso também suprimiria erros legítimos, por exemplo, a pasta de destino não existe. Não consigo encontrar uma maneira mais elegantemv
de excluir as entradas.
e..
. Butt big plus para mim sobre cp não está gravando novos arquivos no disco.Se você estiver
ls -l
em um diretório, verá.
e..
entre os arquivos listados. Então, acho quemv .* /dest
leva esses indicadores em consideração. Experimentar:isso ignorará os ponteiros dir e pai atuais.
Você receberá um erro se qualquer um dos três padrões
*
,[^.]*
ou..?*
corresponde nenhum arquivo, assim que você deve incluir apenas os que correspondem.fonte
Duas soluções possíveis em que consigo pensar. A primeira é usar cp em vez disso com sua opção recursiva, copiando o diretório atual para o destino.
então você pode remover os arquivos de origem no diretório atual
Como alternativa, se você souber que os arquivos têm um nome seguro (sem espaços, curingas, caracteres não imprimíveis), poderá fazer algo assim
fonte
-p
de preservar os metadados. O usols
deve ser o último recurso, e aqui existem maneiras melhores e mais simples.Não existe realmente arquivos "ocultos" no Linux. Os arquivos que começam com um ponto estão ocultos das listagens de arquivos por padrão.
Para copiar arquivos mesmo com um glob, você precisa prefixar o arquivo
.
comomv -u .* foo
e, em seguida,.foo
será exibido comofoo/.foo
quando movido.A opção -u somente moverá os arquivos quando a fonte for mais nova ou o destino estiver ausente. Ou você pode simplesmente ignorar os erros sobre a movimentação
.
e..
como eles são arquivos especiais e não podem ser movidos, mas ficam presos na.*
bola pelo shell.fonte
Então nós temos:
e:
Demorei bastante para encontrar uma solução melhor do que todas as respostas aqui.
Depois, levei 30 segundos para este comando:
Então eu encontrei meu amor:
Nota: Eu nem entendo o argumento
-T
. Apenas fiz o que eu precisava. Aqui diz:fonte
-T
. De qualquer maneira, isso está essencialmente dizendo ao mv para mover o próprio diretório, em vez de mover todos os arquivos de dentro dele.No meu caso, eu estava simplesmente tentando
mv
um único arquivo oculto e esta foi a solução:Explicação
No começo eu estava tentando:
Mas continuou produzindo o erro:
Mesmo que um
ls -al
mostrou que o arquivo edest/
existia.O motivo parece ser porque o shell estava interpretando o "." no nome do arquivo, movendo-o para uma variável, evita a interpretação. Provavelmente existem outras maneiras de resolver isso, mas isso foi suficiente para nós.
fonte
Se você deseja copiar arquivos, incluindo arquivos ocultos, para o diretório atual em que está.
fonte