Qual é a diferença entre * e *. * Durante a cópia?

19

Qual é a diferença entre os 2 comandos a seguir?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/
stany
fonte
12
Embora ambas as respostas estejam corretas, acho que há uma coisa a ser observada. Arquivos ocultos (arquivos que começam com .like .bashrc) não são copiados com nenhum desses comandos. Para copiar os arquivos que você explicitamente deve indicar que, com .*isso, para copiar todos os arquivos (incluindo as ocultas) o comando seriacp -rp /dir1/.* /dir1/* /dir2/
yomismo
Em resumo, *.*é a maneira do MS-DOS / Windows de fazê-lo, enquanto *é a maneira do UNIX / Linux. No sufixo Unix (final de arquivo, a parte após .- como .txtou .jpg) é opcional ... No MS-DOS, o .(ponto) e o sufixo eram necessários, para corresponder a todos os arquivos, um usado *.*- enquanto correspondia a todos os arquivos de texto , um usaria *.txt.
Baard Kopperud
O sufixo @BaardKopperud não era necessário, poderia haver arquivos com nome como FILENAMEou mesmo FILE.
Ruslan
1
@Ruslan, mas *.*no DOS ainda corresponde aos arquivos nomeados FILENAMEou FILE, porque o nome é 'realmente' FILENAME.ou FILE.(com uma extensão vazia). No Unix, o nome é 'realmente' FILENAMEou FILE, portanto *.*, não corresponde.
Jonathan Cast
1
@Ruslan Era necessário no DOS real, não era mais necessário no Windows. De volta aos velhos tempos , uma única *só iria corresponder FILE, e não FILE.TXT .
usar o seguinte comando

Respostas:

25

*.*só corresponde aos nomes de arquivos com um ponto no meio ou no final. Por exemplo:

abc.jpg
def. 

*corresponde aos nomes dos arquivos acima, além dos nomes que não possuem um ponto. por exemplo:

data
David Dai
fonte
6
Talvez também observe que o anti-idioma *.*costumava ser a maneira correta de corresponder todos os arquivos no MS-DOS no dia de 8 + 3 nomes de arquivos. No MS-DOS, o ponto é obrigatório (embora implícito em arquivos que não possuem extensão).
Tripleee
11
@ Mark, não, acho que não. a menos que você esteja usando o dotglob.
David Dai
11
Nunca percebi que isso *.*combina, foo.mas não .foo. Essa assimetria é terrível.
Jamesdlin # 29/15
9
@jamesdlin, do bash manual: Quando um padrão é usado para a expansão do nome do arquivo, o caractere '.' no início de um nome de arquivo ou imediatamente após uma barra deve ser correspondido explicitamente, a menos que a opção shell dotglob esteja configurada.
David Dai
1
@jamesdlin. Desde o primeiro dia do Unix (por volta de 1969), as entradas do diretório que começavam com um ponto eram consideradas ocultas . Originalmente, isso era necessário para pular as entradas .(diretório atual) e ..(diretório pai) que sempre existem em qualquer diretório (mesmo em diretórios vazios). Ritchie e Thompson mais tarde consideraram um recurso útil ocultar (por padrão) todos os .*rcarquivos de configuração e adicionou uma -aopção explícita lspara exibir todas essas entradas "ocultas" (ponto inicial). Portanto, não é muito surpreendente conhecer a história do Unix. Um ponto líder no Unix é especial desde "para sempre".
Arielf
13

Suponha que você tenha os seguintes arquivos em /dir1:

foobar  
foo.bar  
fo.ba  
foo1.bar2  
foobar1  
foobar2  

cp -rp /dir1/*.* /dir2/

Este comando copiará apenas os seguintes arquivos:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Isso copiará todos os arquivos em /dir1

A condição também se aplica aos subdiretórios /dir1.

Novas terras
fonte