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
, zsh
bạn có thể sử dụng dotglob
tù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 ( yash
cũng có dotglob
tùy chọn; tuy nhiên, sau đó nó bao gồm .
và ..
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 target
có 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 dotglob
cài đặt tôi đã đề cập. Nó sẽ không xóa thư mục source
chí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 source
thư 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.
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.rm
chỉ 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).