Como posso obter o mv (ou o curinga *) para mover arquivos ocultos?

97

Estou migrando meu diretório home de um sistema antigo para um novo, e o tarball que eu fiz contém tudo, incluindo arquivos ocultos como .bashrc. No entanto, quando eu movo o conteúdo do tarball descompactado (que estão em / tmp) para o meu novo diretório inicial, os arquivos ocultos não copiam ( mv /tmp/home/rcook/* /home/rcook/ ). Como posso fazer o mv movê-los?

Na verdade, acho que o problema não é com o mv, mas com o globbing. Se eu fizer isso:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

Eu vejo isto:

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 possa descompactar o tarball diretamente no meu diretório inicial, mas o tarball é descompactado em home/rcook/... e quero ter certeza de que sobrescrevo o novo .bashrc etc. com as versões antigas e personalizadas. e saber como localizar e mover arquivos ocultos é uma habilidade que vale a pena. Sugestões?

Algumas respostas sugerem algo como mv src/.* dest/ . No entanto, tentei isso nos meus diretórios de teste e recebi 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 de errado?

    
por Randall Cook 21.02.2013 / 20:14

7 respostas

109

Você pode fazer isso:

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

Você pode colocar

shopt -s dotglob

no seu ~/.bashrc se você quiser que seja o padrão.

Veja o link

Outra abordagem para copiar os arquivos de pontos:

mv /tmp/home/rcook/.[!.]* /home/rcook/

Não use o padrão ..* , pois ele corresponde a .. (ponteiro para o diretório pai). Se houver arquivos cujo nome comece com dois pontos ( ..something ), use também o padrão ..?* .

    
por Gilles Quenot 21.02.2013 / 20:16
21

Nas suas adições, você tem erros, mas o código ainda funcionou. A única coisa a acrescentar é que você disse a ele apenas para copiar os arquivos de ponto. Experimente:

mv src/* src/.* dst/

Você ainda receberá os erros para o. e .. entradas, o que é bom. Mas o movimento deve ter sucesso.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move ‘from/.’ to ‘to/.’: Device or resource busy
mv: cannot remove ‘from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test
    
por Andrew Schwartz 03.01.2014 / 19:47
9

Se você ls -l em um diretório, verá . e .. entre os arquivos listados. Então, eu acho que mv .* /dest leva esses ponteiros em consideração. Experimente:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

isto irá ignorar os ponteiros do diretório atual e pai.

Você receberá um erro se qualquer um dos três padrões * , [^.]* ou ..?* não corresponder a nenhum arquivo, portanto você deve incluir apenas os que corresponderem.

    
por Azamat 14.06.2014 / 14:20
4

Duas possíveis soluções que posso pensar. A primeira é usar o cp com sua opção recursiva, copiando o diretório atual para o destino.

cp -Rp . /desired/directory

então você pode remover os arquivos de origem no diretório atual

Alternativamente, se você sabe que os arquivos são sanamente nomeados (sem espaços, curingas, caracteres não imprimíveis), você pode fazer algo parecido com isto

mv $(ls -A) /desired/directory
    
por Drake Clarris 21.02.2013 / 23:03
2

Não existem arquivos "ocultos" no Linux. Os arquivos que começam com um ponto são ocultados das listagens de arquivos por padrão.

Para copiar arquivos mesmo com um glob, você precisa prefixar o arquivo com . como mv -u .* foo e, em seguida, .foo aparecerá como foo/.foo quando movido.

A opção -u moverá somente os arquivos quando a fonte for mais recente ou o destino estiver ausente. Ou você poderia simplesmente ignorar os erros sobre mover . e .. , já que eles são arquivos especiais e não podem ser movidos, mas sejam pegos no .* glob pelo shell.

    
por dobey 21.02.2013 / 20:17
0

Então nós temos:

a
|-- .foo
'-- bar

e:

b

Eu levei um tempo enorme para encontrar uma solução melhor do que todas as respostas aqui.

Então eu levei 30 segundos para este comando:

$ mv --help

Então eu encontrei meu amor:

$ mv a/ b/ -T

Nota: eu nem entendo o argumento -T . Apenas fez o que eu precisava. Aqui está escrito:

  

-T, --no-target-directory trata o DEST como um arquivo normal

    
por user433901 28.07.2015 / 02:42
-1

Se você deseja copiar arquivos, incluindo arquivos ocultos, para o diretório atual em que você está.

cp -Rp source-directory/. .
    
por Rick 05.09.2016 / 02:51