khác biệt sao chép thư mục nội dung giữa /. và / * trong linux


8

để sao chép nội dung từ thư mục tôi đã đọc, sử dụng là:

cp -rfva ../foldersource/. ./

nhưng điều này cũng hoạt động

cp -rfva ../foldersource/* ./

có sự khác biệt nào không?

bằng ví dụ nếu tôi muốn xóa một nội dung từ một thư mục với. :

rm -rf ../foldersource/.

tôi nhận được lỗi:

rm:  rejet delete folder '.' or '..':

nhưng với dấu hoa thị là ok

rm -rf ../foldersource/*

Vì vậy, dấu hoa thị là lựa chọn tốt hơn mà làm việc ở bất cứ đâu?

Câu trả lời:


10

Có một sự khác biệt cơ bản giữa hai hình thức đối số này. Và đó là một điều quan trọng để hiểu những gì đang xảy ra.

Với ../foldersource/.các đối số được truyền không thay đổi để lệnh, cho dù đó là cphay rmhay cái gì khác. Tùy thuộc vào việc dấu chấm đó có ngữ nghĩa đặc biệt hay duy nhất khác với quy ước Unix tiêu chuẩn chỉ đơn giản là trỏ đến thư mục mà nó cư trú; cả hai rmcpdường như coi nó như một trường hợp đặc biệt.

Với ../foldersource/*đối số được mở rộng đầu tiên bởi shell trước khi lệnh thậm chí được thực thi và vượt qua bất kỳ đối số nào. Như vậy, rmkhông bao giờ nhìn thấy ../foldersource/*; Nó thấy phiên bản mở rộng ../foldersource/file1.ext ../foldersource/file2.ext ../foldersource/childfolder1và như vậy. Điều này rất quan trọng vì các hệ điều hành giới hạn số lượng đối số có thể được truyền cho một lệnh, thường chỉ vài trăm.


4
It's up to the command whether that trailing dot makes any senseỪm, dấu chấm luôn liên kết đến chính thư mục chứa, vì vậy ../foldersource/.không nên khác với việc nêu ./foldersource/và thực tế nó chỉ là một cách thừa để nêu điều tương tự. Không có lệnh nào cố gắng "làm cho ý nghĩa" của dấu chấm hoặc dấu chấm kép, vì đây là các tiêu chuẩn trên các hệ thống tệp Linux / Unix. rmchỉ cần từ chối loại bỏ thư mục làm việc hiện tại như jimmijđã nêu trong câu trả lời của họ. Ngoài ra, lưu ý rằng bạn đang sử dụng ./trong tất cả các ví dụ của mình trong khi OP có ../ở đó. Một chút khác biệt (lớn).
Sergiy Kolodyazhnyy

"cp -rfva ../ Foldersource/. ./" tương đương với "cp -rfva ../ Foldersource ./", tôi muốn sao chép nội dung thư mục, nhưng không phải là thư mục gốc
stackdave 24/07/2017

1
@Stackdave không, cp -rfva ../foldersource/. ./ KHÔNG tương đương với cp -rfva ../foldersource ./ . Dấu vết /.rất có ý nghĩa
roaima

2
Mặc dù câu trả lời này là chính xác, nhưng nó lại thiếu một sự khác biệt rất quan trọng như được đề cập trong câu trả lời của @ roaima: biến thể / * không (thường) sao chép các tệp hoặc thư mục bắt đầu bằng.
Adam

@SergiyKolodyazhnyy Bạn nói đúng; đó .là một quy ước chuẩn trong Unix để biểu thị trực tiếp hiện tại. Ngoài ra, cảm ơn bạn đã chỉ ra rằng tôi đã sử dụng ./trong các ví dụ của mình khi tôi nên sử dụng ../; Tôi sẽ sửa nó. Bạn không chính xác về việc các lệnh "có ý nghĩa" của dấu chấm; như OP chỉ ra (và tôi đã có kinh nghiệm cp) cả hai rmcpcư xử khác nhau khi có dấu vết .. Tôi nên viết một cái gì đó như "tùy theo lệnh nếu dấu chấm có ngữ nghĩa đặc biệt hoặc duy nhất". Tôi sẽ thay đổi câu trả lời của tôi cho rõ ràng.
eestrada

10

Khi bạn sao chép sử dụng cp -a source/* target/bạn đang sao chép hầu hết các tập tin và thư mục từ sourceđể target. Cụ thể, các mục được loại trừ có thể sẽ là các tệp bắt đầu bằng dấu chấm ( .) ở cấp cao nhất source.

Xem xét các tệp (hoặc thư mục) trong source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will not be copied

Khi bạn sao chép bằng cách sử dụng, cp -a source/. target/bạn đang sao chép toàn bộ nội dung của source, bao gồm mọi mục bắt đầu bằng dấu chấm ( .) sangtarget

Xem xét các tệp (hoặc thư mục) trong source

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will be copied

Nếu bạn đang sử dụng bash, zshbạn có thể sử dụng dotglobtùy chọn để thay đổi ý nghĩa của *nó để bao gồm các tệp và thư mục bắt đầu bằng dấu chấm ( yashcũng có dotglobtùy chọn; tuy nhiên, sau đó nó bao gồm ...mở rộng toàn cầu làm hạn chế khả năng sử dụng của nó. Xem thêm FIGNORE='@(.|..)'trong ksh93).

Thật thú vị, cp -a source/. target/được đảm bảo không bao giờ tạo ra các thành phần target/source. (Mặt khác, cp -a source target/sẽ thực hiện một trong hai điều tùy thuộc vào việc targetcó tồn tại hay không . Xem Cách sao chép một thư mục theo cách đệ quy bằng cách sử dụng cp để biết chi tiết.)


Khi bạn xóa bằng cách sử dụng, rm -rf source/*bạn đang xóa các tệp và thư mục trong sourceđó không bắt đầu bằng dấu chấm ( .). Theo dotglobcài đặt tôi đã đề cập. Nó sẽ không xóa thư mục sourcechính nó.

Khi bạn cố xóa bằng cách sử dụng, rm -rf source/.nó sẽ thất bại - như những người khác đã giải thích - vì POSIX cấm xóa một đường dẫn có thành phần cuối cùng là .hoặc ... Tương đương gần nhất là rm -rf source, sẽ xóa sourcethư mục và tất cả nội dung của nó bất kể chúng có bắt đầu bằng dấu chấm ( .) hay không.



7

Bạn không thể làm rm -rf ../foldersource/.rmkhông cho phép điều này, như được nêu rõ trong hướng dẫn:

Mọi nỗ lực xóa tệp có thành phần tên tệp cuối cùng là '.' hoặc '..' bị từ chối mà không có bất kỳ lời nhắc nào, như được ủy quyền bởi POSIX.

và trong hướng dẫn POSIX man 1p rmchúng ta thấy:

Nếu một trong hai dấu chấm hoặc dấu chấm chấm được chỉ định là phần tên cơ sở của toán hạng (nghĩa là thành phần tên đường dẫn cuối cùng) hoặc nếu toán hạng giải quyết vào thư mục gốc, rm sẽ viết thông báo chẩn đoán thành lỗi tiêu chuẩn và không làm gì cả nhiều hơn với các toán hạng như vậy.

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.