¿Cuál es la diferencia entre * y *. * Al copiar?

19

¿Cuál es la diferencia entre los siguientes 2 comandos?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/
stany
fuente
12
Aunque ambas respuestas son correctas, creo que hay una cosa a tener en cuenta. Los archivos ocultos (archivos que comienzan con .like .bashrc) no se copian con ninguno de esos comandos. Para copiar esos archivos, debe indicar explícitamente que con .*eso, para copiar todos los archivos (incluidos los ocultos), el comando seríacp -rp /dir1/.* /dir1/* /dir2/
YoMismo
En resumen, *.*es la forma MS-DOS / Windows de hacerlo, mientras que *es la forma UNIX / Linux. En el sufijo Unix (finalización de archivo, la parte después de .- like .txtor .jpg) es opcional ... En MS-DOS .se requería el (punto) y el sufijo, por lo que para que coincida con todos los archivos, se usa uno *.*, mientras que para que coincida con todos los archivos de texto , uno lo usaría *.txt.
Baard Kopperud
No se requirió el sufijo @BaardKopperud, podría haber archivos con nombre como FILENAMEo incluso FILE.
Ruslan
1
@Ruslan pero *.*en DOS todavía coincide con los archivos nombrados FILENAMEo FILE, porque el nombre es 'realmente' FILENAME.o FILE.(con una extensión vacía). En Unix, el nombre es "realmente" FILENAMEo FILE, por *.*lo que no coincidirá.
Jonathan Cast
1
@Ruslan Se requería en DOS real, ya no se requiere en Windows. En los viejos tiempos , un solo *solo coincidiría FILE, y no FILE.TXT .
Random832

Respuestas:

25

*.*solo coincide con los nombres de archivo con un punto en el medio o al final. Por ejemplo:

abc.jpg
def. 

*coincide con los nombres de archivo anteriores, más los nombres que no tienen un punto en absoluto. por ejemplo:

data
David Dai
fuente
66
Quizás también tenga en cuenta que el anti-idioma *.*solía ser la forma correcta de hacer coincidir todos los archivos en MS-DOS en el día de 8 + 3 nombres de archivo. En MS-DOS, el punto es obligatorio (aunque implícito en los archivos que no tienen una extensión).
tripleee
11
@ Mark, no, no lo creo. a menos que tenga dotglob encendido.
David Dai
11
Huh, nunca me di cuenta de que *.*coincide foo.pero no .foo. Esa asimetría es terrible.
jamesdlin
99
@jamesdlin, del manual bash: cuando se usa un patrón para la expansión del nombre de archivo, el carácter '.' al comienzo de un nombre de archivo o inmediatamente después de una barra debe coincidir explícitamente, a menos que se establezca la opción de shell dotglob.
David Dai
1
@jamesdlin. Desde el primer día de Unix (circa 1969), las entradas de directorio que comienzan con un punto se consideraron ocultas . Originalmente, esto era necesario para omitir las entradas .(directorio actual) y ..(directorio principal) que siempre existen en cualquier directorio (incluso directorios vacíos). Ritchie y Thompson más tarde lo consideraron una característica útil para ocultar (por defecto) todos los .*rcarchivos de configuración y agregaron una -aopción explícita lspara mostrar todas estas entradas "ocultas" (punto inicial). Así que esto no es muy sorprendente conocer la historia de Unix. Un punto líder en Unix ha sido especial desde "para siempre".
arielf
13

Supongamos que tiene los siguientes archivos en /dir1:

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

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

Este comando copiará solo los siguientes archivos:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Esto copiará todos los archivos en /dir1

La condición también se aplica a los subdirectorios en /dir1.

Nuevas tierras
fuente