Sự khác biệt giữa * và *. * Trong khi sao chép là gì?


19

Sự khác biệt giữa 2 lệnh sau là gì?

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

12
Mặc dù cả hai câu trả lời đều đúng, tôi nghĩ có một điều cần lưu ý. Các tệp ẩn (tệp bắt đầu bằng .like .bashrc) không được sao chép với bất kỳ lệnh nào trong số đó. Để sao chép các tệp đó, bạn nên chỉ rõ một cách rõ ràng rằng với điều .*đó, để sao chép tất cả các tệp (bao gồm cả các tệp bị ẩn), lệnh sẽ làcp -rp /dir1/.* /dir1/* /dir2/
YoMismo

Nói tóm lại, *.*là cách làm của MS-DOS / Windows, trong khi đó *là cách UNIX / Linux. Trong hậu tố Unix (kết thúc tệp, phần sau .- giống .txthoặc .jpg) là tùy chọn ... Trong MS-DOS ., bắt buộc (dấu chấm) và hậu tố, do đó, để khớp với tất cả các tệp, một tệp được sử dụng *.*- trong khi khớp với tất cả các tệp văn bản , người ta sẽ sử dụng *.txt.
Baard Kopperud

Hậu tố @BaardKopperud không bắt buộc, có thể có các tệp có tên như FILENAMEhoặc thậm chí FILE.
Ruslan

1
@Ruslan nhưng *.*trong DOS vẫn khớp với các tệp có tên FILENAMEhoặc FILE, vì tên đó là 'thực sự' FILENAME.hoặc FILE.(với phần mở rộng trống). Trong Unix, tên là 'thực sự' FILENAMEhoặc FILE, vì vậy *.*sẽ không khớp.
Jonathan Cast

1
@Ruslan Nó được yêu cầu trên DOS thực tế, không bắt buộc nữa trên windows. Quay lại thời xưa , một người duy nhất *sẽ chỉ phù hợp FILE, và không FILE.TXT .
Random832

Câu trả lời:


25

*.*chỉ khớp tên tệp có dấu chấm ở giữa hoặc ở cuối. Ví dụ:

abc.jpg
def. 

*khớp với tên tệp ở trên, cộng với tên không có dấu chấm nào cả. ví dụ:

data

6
Có lẽ cũng lưu ý rằng thành ngữ chống lại *.*được sử dụng là cách chính xác để khớp tất cả các tệp trên MS-DOS trở lại vào ngày của tên tệp 8 + 3. Trong MS-DOS, dấu chấm là bắt buộc (mặc dù ẩn trên các tệp không có phần mở rộng).
tripleee

11
@Mark, Không, tôi không nghĩ vậy. trừ khi bạn có dotglob trên.
David Đại

11
Huh, tôi không bao giờ nhận ra rằng *.*trận đấu foo.nhưng không .foo. Sự bất cân xứng đó thật kinh khủng.
jamesdlin

9
@jamesdlin, từ hướng dẫn bash: Khi một mẫu được sử dụng để mở rộng tên tệp, ký tự '.' khi bắt đầu tên tệp hoặc ngay sau dấu gạch chéo phải được khớp rõ ràng, trừ khi tùy chọn shell dotglob được đặt.
David Đại

1
@jamesdlin. Kể từ ngày đầu tiên của Unix (khoảng năm 1969), các mục trong thư mục bắt đầu bằng dấu chấm được coi là ẩn . Ban đầu điều này là cần thiết để bỏ qua các mục .(thư mục hiện tại) và ..(thư mục mẹ) luôn tồn tại trong bất kỳ thư mục nào (ngay cả các thư mục trống). Ritchie và Thompson sau đó coi đây là một tính năng hữu ích để ẩn (theo mặc định) tất cả các .*rctệp cấu hình và thêm một -atùy chọn rõ ràng lsđể hiển thị tất cả các mục "ẩn" hàng đầu này. Vì vậy, điều này không có gì đáng ngạc nhiên khi biết lịch sử Unix. Một dấu chấm hàng đầu trong Unix đã trở nên đặc biệt kể từ "mãi mãi".
thân

13

Giả sử bạn có các tệp sau trong /dir1:

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

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

Lệnh này sẽ chỉ sao chép các tệp sau:

foo.bar  
fo.ba  
foo1.bar2 

cp -rp /dir1/* /dir2/

Điều này sẽ sao chép tất cả các tập tin trong /dir1

Điều kiện này cũng áp dụng cho các thư mục con /dir1..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.