Tôi cầu xin bạn, bước ra khỏi vỏ mở rộng đồng bằng trên cp
dòng lệnh - mở rộng vỏ có tất cả các loại e hèm . Trường hợp góc "thú vị" (đệ quy không mong muốn do và .., không gian, công cụ không thể in được, liên kết cứng, liên kết tượng trưng, và v.v.) Sử dụng find
thay thế (nó đi kèm trong findutils
gói, trong trường hợp bạn chưa cài đặt nó - điều này thật kỳ lạ, tất cả các bản phân phối đều cài đặt nó theo mặc định):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Từng bước giải thích:
-H
sẽ khiến find
không theo các liên kết tượng trưng (trừ khi tên thư mục toplevel thực tế mà bạn đặt cho nó là một liên kết tượng trưng; nó sẽ theo sau.)
/path/to/toplevel/dir/
rõ ràng là được thay thế bởi bạn bằng đường dẫn thực hiện thư mục lưu trữ các tệp cài đặt và thư mục bạn muốn sao lưu.
-maxdepth 1
sẽ dừng find
từ đệ quy giảm dần vào bất kỳ thư mục nào có tên bắt đầu bằng dấu chấm. Chúng tôi không cần nó để tái diễn, cp
sẽ làm điều đó cho chúng tôi, chúng tôi chỉ cần tên ở cấp độ này.
-name '.*'
nói find
rằng chúng tôi muốn tất cả các tên bắt đầu bằng một dấu chấm. Điều này sẽ không hoạt động chính xác nếu biến môi trường POSIXLY_CORRECT
được đặt, nhưng hiếm khi (nếu có). Đây là điều kiện khớp đầu tiên chúng tôi đã chỉ định cho đến nay.
a \( ....... \)
là một và theo sau là một điều kiện phức tạp hơn trong ngoặc đơn (tôi đã sử dụng ..... để thay thế nó, nó được giải thích bên dưới.) Chúng ta cần thoát khỏi dấu ngoặc đơn vì chúng sẽ bị (mis) giải thích bằng vỏ, do đó dấu gạch chéo ngược trước mặt họ,
-type d -o -type f -o -type l
là ba điều kiện với một hoặc giữa chúng. -type d
phù hợp với các thư mục, -type f
phù hợp với các tập tin thông thường và -type l
phù hợp với các liên kết tượng trưng. Bạn có thể chọn những gì bạn muốn - ví dụ: nếu bạn không muốn sao lưu các thư mục cài đặt, hãy bỏ qua -type d
(và -o
ngay phía sau nó, rõ ràng.)
-exec ..... \;
nói find
để thực hiện một lệnh mỗi khi gặp phải một trận đấu. Phần cuối của lệnh được đánh dấu bằng dấu chấm phẩy, một lần nữa chúng ta cần thoát bằng dấu gạch chéo ngược để tránh giải thích shell. Trong dòng lệnh đó, bạn cần sử dụng {}
nơi bạn muốn tên của trận đấu hiện đang gặp phải kết thúc. Vì các vỏ sò cũng có thể hiểu sai các dấu ngoặc nhọn, bạn nên đặt chúng trong dấu nháy đơn, như trong '{}'
. Lệnh chúng tôi muốn thực thi trong trường hợp này là cp -a '{}' /path/to/destination/dir/
(-a có nghĩa là lưu trữ, đệ quy trong thư mục con, sao chép liên kết dưới dạng liên kết và bảo toàn quyền và thuộc tính mở rộng và /path/to/destination/dir/
rõ ràng là tên của thư mục đích - thay thế nó.)
Vì vậy, trong tiếng Anh đơn giản, find
dòng lệnh này nói rằng:
Bắt đầu tại / path / to / toplevel / dir /. Không đi xuống bất kỳ thư mục con. Tìm tất cả các thư mục, tệp và liên kết tượng trưng có tên bắt đầu bằng dấu chấm. Đối với mỗi trong số những người bạn đã tìm thấy, hãy sao chép nó vào / path / to / Destination / dir / bảo tồn tính chất, quyền và các thuộc tính mở rộng.
-r
và-R
không?