Quelle est la différence entre * et *. * Lors de la copie?


19

Quelle est la différence entre les 2 commandes suivantes?

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

12
Même si les deux réponses sont correctes, je pense qu'il y a une chose à noter. Les fichiers cachés (fichiers commençant par .like .bashrc) ne sont copiés avec aucune de ces commandes. Pour copier ces fichiers, vous devez explicitement indiquer qu'avec .*cela, pour copier tous les fichiers (y compris ceux cachés), la commande seraitcp -rp /dir1/.* /dir1/* /dir2/
YoMismo

En bref, *.*c'est la façon de faire MS-DOS / Windows, tandis que *c'est la manière UNIX / Linux. En suffixe Unix (fin de fichier, la partie après le .- comme .txtou .jpg) est facultative ... En MS-DOS, le .(point) et le suffixe étaient requis, donc pour faire correspondre tous les fichiers, un utilisé *.*- tandis que pour faire correspondre tous les fichiers texte , on utiliserait *.txt.
Baard Kopperud

Le suffixe @BaardKopperud n'était pas requis, il pourrait y avoir des fichiers avec un nom comme FILENAMEou même FILE.
Ruslan

1
@Ruslan mais *.*sous DOS correspond toujours aux fichiers nommés FILENAMEou FILE, car le nom est «vraiment» FILENAME.ou FILE.(avec une extension vide). Sous Unix, le nom est «vraiment» FILENAMEou ne correspondra FILEdonc *.*pas.
Jonathan Cast

1
@Ruslan Il était requis sous DOS réel, plus nécessaire sous Windows. De retour dans les vieux jours , un seul *ne ferait que correspondre FILE, et non FILE.TXT .
Random832

Réponses:


25

*.*correspond uniquement aux noms de fichiers avec un point au milieu ou à la fin. Par exemple:

abc.jpg
def. 

*correspond aux noms de fichiers ci-dessus, plus les noms qui n'ont pas de point du tout. par exemple:

data

6
Peut-être aussi noter que l'anti-idiome *.*était la bonne façon de faire correspondre tous les fichiers sur MS-DOS au jour des noms de fichiers 8 + 3. Dans MS-DOS, le point est obligatoire (bien qu'implicite sur les fichiers qui n'ont pas d'extension).
tripleee

11
@Mark, non, je ne pense pas. sauf si vous avez dotglob.
David Dai

11
Huh, je n'ai jamais réalisé que ça *.*correspond foo.mais pas .foo. Cette asymétrie est terrible.
jamesdlin

9
@jamesdlin, du manuel bash: Lorsqu'un modèle est utilisé pour l'expansion du nom de fichier, le caractère '.' au début d'un nom de fichier ou immédiatement après une barre oblique doit correspondre explicitement, sauf si l'option shell dotglob est définie.
David Dai

1
@jamesdlin. Depuis le 1er jour d'Unix (vers 1969), les entrées de répertoire commençant par un point étaient considérées comme masquées . À l'origine, cela était nécessaire pour ignorer les entrées .(répertoire actuel) et ..(répertoire parent) qui existent toujours dans n'importe quel répertoire (même les répertoires vides). Ritchie et Thompson ont ensuite considéré qu'il s'agissait d'une fonctionnalité utile pour masquer (par défaut) tous les .*rcfichiers de configuration et ont ajouté une -aoption explicite lspour afficher toutes ces entrées «cachées» (point principal). Ce n'est donc pas très surprenant de connaître l'histoire d'Unix. Un point important dans Unix est spécial depuis "toujours".
arielf

13

Supposons que vous ayez les fichiers suivants dans /dir1:

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

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

Cette commande copiera uniquement les fichiers suivants:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Cela copiera tous les fichiers dans /dir1

La condition s'applique également aux sous-répertoires de /dir1.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.