Was ist der Unterschied zwischen * und *. * Beim Kopieren?

19

Was ist der Unterschied zwischen den folgenden 2 Befehlen?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/
stany
quelle
12
Auch wenn beide Antworten richtig sind, muss meines Erachtens eines beachtet werden. Versteckte Dateien (Dateien, die mit .like beginnen .bashrc) werden mit keinem dieser Befehle kopiert. Um diese Dateien zu kopieren, sollten Sie ausdrücklich angeben, dass .*zum Kopieren aller Dateien (einschließlich versteckter Dateien) der Befehl cp -rp /dir1/.* /dir1/* /dir2/
lautet:
Kurz gesagt, *.*ist es die MS-DOS / Windows-Methode, während *es die UNIX / Linux-Methode ist. In Unix-Suffix (Dateiendung, der Teil nach .- like .txtoder .jpg) ist optional ... In MS-DOS waren .(Punkt) und Suffix erforderlich, damit alle Dateien übereinstimmen, eine wurde verwendet *.*- während alle Textdateien übereinstimmen würde man benutzen *.txt.
Baard Kopperud,
@ BaardKopperud Suffix war nicht erforderlich, es könnte Dateien mit Namen wie FILENAMEoder sogar geben FILE.
Ruslan
1
@Ruslan aber *.*in DOS stimmt immer noch mit Dateien mit dem Namen FILENAMEoder überein FILE, weil der Name "wirklich" FILENAME.oder FILE.(mit einer leeren Erweiterung) ist. In Unix ist der Name "wirklich" FILENAMEoder FILE, *.*wird also nicht übereinstimmen.
Jonathan Cast
1
@ Ruslan Wurde unter DOS benötigt, unter Windows nicht mehr. Früher passte ein Single *nur zusammen FILEund nicht FILE.TXT .
Random832

Antworten:

25

*.*Stimmt nur mit Dateinamen überein, die einen Punkt in der Mitte oder am Ende haben. Beispielsweise:

abc.jpg
def. 

*Entspricht den obigen Dateinamen sowie den Namen, die überhaupt keinen Punkt haben. beispielsweise:

data
David Dai
quelle
6
Beachten Sie möglicherweise auch, dass das Anti-Idiom *.*die richtige Methode war, um alle Dateien unter MS-DOS ab dem Tag von 8 + 3 Dateinamen abzugleichen. In MS-DOS ist der Punkt obligatorisch (wenn auch implizit für Dateien, die keine Erweiterung haben).
Tripleee
11
@Mark, nein, das glaube ich nicht. es sei denn du hast dotglob an.
David Dai
11
Huh, ich nie realisiert *.*Matches foo.aber nicht .foo. Diese Asymmetrie ist schrecklich.
Jamesdlin
9
@jamesdlin, aus dem Bash-Handbuch: Wenn ein Muster für die Dateinamenerweiterung verwendet wird, wird das Zeichen '.' am Anfang eines Dateinamens oder unmittelbar nach einem Schrägstrich muss explizit eine Übereinstimmung gefunden werden, es sei denn, die Shell-Option dotglob ist gesetzt.
David Dai
1
@jamesdlin. Seit dem 1. Tag von Unix (ca. 1969) wurden Verzeichniseinträge, die mit einem Punkt beginnen, als verborgen betrachtet . Ursprünglich wurde dies benötigt, um die Einträge .(aktuelles Verzeichnis) und ..(übergeordnetes Verzeichnis) zu überspringen, die immer in einem beliebigen Verzeichnis vorhanden sind (auch leere Verzeichnisse). Ritchie und Thompson betrachteten es später als nützliche Funktion, alle .*rcKonfigurationsdateien (standardmäßig) auszublenden, und fügten eine explizite -aOption hinzu ls, um alle diese (mit einem führenden Punkt versehenen) "versteckten" Einträge anzuzeigen. Das ist also nicht sehr überraschend, wenn man die Unix-Geschichte kennt. Ein führender Punkt in Unix ist seit "für immer" etwas Besonderes.
Arielf
13

Angenommen, Sie haben folgende Dateien in /dir1:

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

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

Dieser Befehl kopiert nur die folgenden Dateien:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Dadurch werden alle Dateien in kopiert /dir1

Die Bedingung gilt auch für die Unterverzeichnisse in /dir1.

Neues Land
quelle