2012-04-30 24 views
7

Tôi đã suy nghĩ một cái gì đó giống như những gì tôi đang cố gắng hoàn thành có thể được thực hiện với các công cụ xây dựng trong vỏ w/o sự cần thiết cho một kịch bản phức tạp hơn.Sao chép đệ quy cho các đường dẫn đích tương đối

Tôi muốn tìm tất cả các tập tin trong một đường dẫn và sao chép chúng vào một basepath điểm đến duy trì các đường dẫn tương đối họ được tìm thấy trong

Ví dụ:.

Say I chạy:

[~:] find /path/src \(-name "*.jpg" -o -name "*.gif" \) 

và đó quay trở lại:

/path/src/a.jpg 
/path/src/dir1/b.jpg 
/path/src/dir2/dir3/c.gif 

tôi muốn họ tất cả kết thúc trong:

/path/dest/a.jpg 
/path/dest/dir1/b.jpg 
/path/dest/dir2/dir3/c.gif 

tôi đã cố gắng một lá cờ -exec cp {} /path/dest \; để find nhưng điều đó chỉ đổ mọi thứ trong/path/dest. Ví dụ:

/path/dest/a.jpg 
/path/dest/b.jpg 
/path/dest/c.gif 
+0

Thuộc http://superuser.com –

Trả lời

5

Bạn có thể sử dụng rsync cho điều này, ví dụ:

$ rsync -av /path/src/ /path/dest/ --include \*/ --include \*.jpg --include \*.gif --exclude \* 

Chỉ cần làm rõ ở trên:

-av    # recursive, copy attributes etc, verbose 
/path/src/  # source 
/path/dest/  # destination (NB: trailing/is important) 
--include \*/ # include all directories 
--include \*.jpg # include files ending .jpg 
--include \*.gif # include files ending .gif 
--exclude \*  # exclude all other files 
+0

Tìm thấy có khả năng xử lý tình huống này không? –

+0

Bạn * có thể * có thể làm điều đó với 'tìm kiếm 'nhưng có vẻ như nó sẽ hoạt động nhiều hơn và dễ bị lỗi hơn, vì vậy rsync' có lẽ là một công cụ tốt hơn cho công việc cụ thể này. –

8

Trên thực tế nó cũng làm việc với cp, những gì bạn muốn là --parents cờ.

cp --parents `find /path/src \(-name "*.jpg" -o -name "*.gif" \)` /path/target 

Lý thuyết -P là từ đồng nghĩa với --parents, nhưng điều đó không bao giờ hiệu quả đối với tôi.

+1

Câu trả lời của bạn là chính xác: '--parents' là câu trả lời đúng. Tuy nhiên, '-P' sai (ý nghĩa của nó là:' không bao giờ theo các liên kết tượng trưng trong SOURCE' và là từ đồng nghĩa của '--no-dereference' –

+1

Lưu ý:' --parents' là một phần mở rộng của GNU cho POSIX. –

+0

@CiroSantilli Nhưng sau đó một lần nữa có bao nhiêu hệ thống bạn biết ** đang được sử dụng tích cực ** không xây dựng trên đầu trang của GNU hay GNU quy ước? [Ngay cả việc thực hiện cp BSD là GNU] (http: //www.freebsd. org/cgi/man.cgi? truy vấn = cp & apropos = 0 & sektion = 1 & manpath = Red + Hat + Linux% 2Fi386 + 9 & format = html) – rioki

Các vấn đề liên quan