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/

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

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..

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.