Sao chép đệ quy các tập tin ẩn - Linux


19

Có cách nào dễ dàng để sao chép đệ quy tất cả các tệp ẩn trong một thư mục sang thư mục khác không? Tôi chỉ muốn sao lưu tất cả các tệp cài đặt trong thư mục chính, không phải các tệp thông thường. Tôi đã thử:

cp -R .* directory

nhưng nó cũng nhận ra ...sao chép tất cả các tệp không bị ẩn. Có cách nào để có được cp để bỏ qua ...?


Có sự khác biệt nào giữa -r-Rkhông?
Chaminda Bandara

Câu trả lời:


15

Yêu thích của tôi để di chuyển dir nói chung đã được:

tar cvf - . | (cd /dest/dir; tar xvf -)

trong đó sắp xếp thư mục hiện tại vào thiết bị xuất chuẩn sau đó chuyển nó sang một thư mục con mà cd đầu tiên đến thư mục đích trước khi mở khóa stdin. Đơn giản, trực tiếp, có thể mở rộng - xem xét những gì xảy ra khi bạn thay thế () bằng ssh sang máy khác. Hoặc để trả lời câu hỏi của bạn, bạn có thể làm:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
Cảm ơn, tùy chọn loại trừ là những gì tôi cần. Tôi đã làm nó theo cách khác, nhưng tôi sẽ giữ nó để tham khảo trong tương lai. Điều này có vẻ thực sự linh hoạt (mặc dù có thể chậm hơn).
Zifre

1
Lời khuyên tốt. Tôi có một vài cải tiến: 1) Sử dụng cd /dest/dir && tar xvf -. Các &&sẽ dừng bạn từ blatting trong thư mục nguồn nếu bạn có một lỗi đánh máy trong đích. 2) Bạn chỉ cần vcờ tar trên một trong các lệnh tar (hoặc không).
Tom Shaw

Đủ công bằng. Tôi cũng đã được biết đến để nhóm các thứ theo cách khác: sao chép một srcdir từ xa vào đây, làm(cd /src/dir && tar cf - .) | tar xvf -
pjz

17

Hầu như mọi lúc điều này có thể được giải quyết chỉ với:

cp -R .[a-zA-Z0-9]* directory

Thật là bất thường khi có một tệp ẩn không bắt đầu với một trong những ký tự đó.

Các mẫu phù hợp khác có sẵn ( .??*, .[^.]*) - xem các bình luận


Điều đó sẽ chỉ bỏ qua.-Xyz - nội dung trong [] chỉ khớp với ký tự đầu tiên sau dấu chấm.
Hamish Downer

6
. [^.] * sẽ nắm bắt mọi thứ
falstro

1
... ngoại trừ những thứ bắt đầu bằng hai thời kỳ.
falstro

@roe - đó cũng là một phiên bản đẹp
Alnitak

@mish - vâng, tôi đã nói nhiều như vậy trong câu trả lời.
Alnitak

11

Bạn có thể sử dụng rsync.

rsync -a ./ /some/other/directory/

sẽ sao chép nội dung của thư mục hiện tại (bao gồm các tệp chấm, nhưng không bao gồm ..)


Đơn giản và hoạt động cho các tập tin ẩn trong các thư mục ẩn quá.
dùng59183

Đối với tôi đây là giải pháp ít gây nhầm lẫn và hiệu quả nhất được cung cấp
palerdot

Giải pháp tốt đẹp. Tôi cũng cần nó để không sao chép qua các thư mục .git. Thêm -C thực hiện điều này và do đó lệnh trở thành:rsync -aC ./ /some/other/directory/
vào

10

Tôi cầu xin bạn, bước ra khỏi vỏ mở rộng đồng bằng trên cpdò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 findthay thế (nó đi kèm trong findutilsgó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:

  • -Hsẽ khiến findkhô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 1sẽ dừng findtừ đệ 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, cpsẽ 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 findrằ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 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 llà ba điều kiện với một hoặc giữa chúng. -type dphù hợp với các thư mục, -type fphù hợp với các tập tin thông thường và -type lphù 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à -ongay 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, finddò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.


1
tìm thấy là điều hữu ích nhất bao giờ hết.
Ông Shiny và New

1
Câu trả lời tốt đẹp. Mặc dù tôi thích -exec ... ';' Tránh dấu gạch chéo ngược có nghĩa là lệnh này sẽ hoạt động cả trong CLI và trong crontab :))
kubanchot

8

Tôi đã luôn sử dụng. ?? * để tìm các tập tin ẩn mà không nhận được "." và "..". Nó có thể bỏ lỡ ".a" hoặc một cái gì đó, nhưng tôi không bao giờ có một trong số đó.


chắc chắn tốt đẹp và gọn gàng :) +1
falstro

Tôi không muốn nó thất bại một cách bí ẩn nếu có một số ".a"
Zifre

Tôi thích nó bởi vì nếu bạn biết bạn không có bất kỳ tệp ẩn ký tự nào, thì thực sự rất nhanh để nhập.
Paul Tomblin

Đây phải là câu trả lời tốt nhất. Nó nên được nâng lên đầu.
Ibn Saeed

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.