Jaka jest różnica między * a *. * Podczas kopiowania?

19

Jaka jest różnica między następującymi 2 poleceniami?

cp -rp /dir1/*.* /dir2/
cp -rp /dir1/* /dir2/
stany
źródło
12
Mimo że obie odpowiedzi są poprawne, myślę, że należy zwrócić uwagę na jedną rzecz. Pliki ukryte (pliki zaczynające się od .podobnego .bashrc) nie są kopiowane za pomocą żadnego z tych poleceń. Aby skopiować te pliki, należy wyraźnie zaznaczyć, że .*tak, aby skopiować wszystkie pliki (w tym ukryte), polecenie cp -rp /dir1/.* /dir1/* /dir2/
brzmiałoby
Krótko mówiąc, *.*jest to sposób na MS-DOS / Windows, podczas gdy *na UNIX / Linux. W uniksowym sufiksie (końcówka pliku, część po .- jak .txtlub .jpg) jest opcjonalna ... W MS-DOS .wymagana była kropka i sufiks, więc aby dopasować wszystkie pliki, jeden użyty *.*- podczas gdy aby dopasować wszystkie pliki tekstowe , można by użyć *.txt.
Baard Kopperud
@ Sufiks BaardKopperud nie był wymagany, mogą istnieć pliki o nazwie podobnej FILENAMElub nawet FILE.
Ruslan
1
@ Ruslan, ale *.*w DOS nadal pasuje do plików o nazwie FILENAMElub FILE, ponieważ nazwa to „naprawdę” FILENAME.lub FILE.(z pustym rozszerzeniem). W Uniksie, nazwa jest „naprawdę” FILENAMEalbo FILE, więc *.*nie będzie pasował.
Jonathan Cast
1
@ Ruslan To było wymagane w rzeczywistym DOS-ie, nie jest już wymagane w Windowsie. W dawnych czasach singiel *pasowałby tylko do niego FILE, a nie do niego FILE.TXT .
Random832

Odpowiedzi:

25

*.*dopasowuje tylko nazwy plików z kropką na środku lub na końcu. Na przykład:

abc.jpg
def. 

*pasuje do nazw plików powyżej oraz nazw, które w ogóle nie mają kropki. na przykład:

data
David Dai
źródło
6
Być może zauważmy również, że antyidiom był *.*kiedyś dobrym sposobem na dopasowanie wszystkich plików w MS-DOS w dniu 8 + 3 nazw plików. W MS-DOS kropka jest obowiązkowa (choć niejawna w przypadku plików, które nie mają rozszerzenia).
tripleee
11
@ Mark, Nie, nie sądzę. chyba że masz włączone dotglob.
David Dai
11
Huh, nigdy nie zdawałem sobie sprawy, że to *.*pasuje, foo.ale nie .foo. Ta asymetria jest okropna.
jamesdlin
9
@jamesdlin, z podręcznika bash: Gdy do interpretacji nazw plików używany jest wzorzec, znak „.” na początku nazwy pliku lub bezpośrednio po ukośniku należy jawnie dopasować, chyba że ustawiono opcję powłoki dotglob.
David Dai
1
@jamesdlin. Od pierwszego dnia Uniksa (około 1969 r.) Wpisy katalogu zaczynające się od kropki były uważane za ukryte . Pierwotnie było to potrzebne do pominięcia pozycji .(bieżący katalog) i ..(katalog macierzysty), które zawsze istnieją w dowolnym katalogu (nawet pustych katalogach). Ritchie i Thompson później uznali, że jest to przydatna funkcja do ukrywania (domyślnie) wszystkich .*rcplików konfiguracyjnych i dodali wyraźną -aopcję lswyświetlania wszystkich tych (ukrytych) pozycji. Nie jest to więc zaskakujące, znając historię Uniksa. Wiodąca kropka w Uniksie jest wyjątkowa od „wieczności”.
arielf
13

Załóżmy, że masz następujące pliki /dir1:

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

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

To polecenie skopiuje tylko następujące pliki:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Spowoduje to skopiowanie wszystkich plików /dir1

Warunek dotyczy również podkatalogów w /dir1..

Nowe ziemie
źródło