Làm thế nào để cp tập tin và tạo thư mục nếu không tồn tại?


15

Tôi muốn sao chép các tệp đã sửa đổi trong kho svn sang thư mục khác, trong khi vẫn giữ cấu trúc thư mục của chúng.

Sau khi đọc trang mank và xargs, tôi tìm cách thay đổi tên tệp như thế này:

$ svn status -q | awk '{ print $2 }' | xargs -d \\n -I '{}' cp '{}' /tmp/xen/

Nhưng vấn đề là theo cách này cấu trúc thư mục không được bảo tồn, tôi muốn sao chép các tệp như thế này:

./common/superp.c -> /tmp/xen/common/superp.c
./common/m2mgr.c -> /tmp/xen/common/m2mgr.c
./common/page_alloc.c -> /tmp/xen/common/page_alloc.c
./arch/x86/mm.c -> /tmp/xen/arch/x86/mm.c
./arch/x86/mm/shadow/private.h -> /tmp/xen/arch/x86/mm/shadow/private.h

Tôi đã cố gắng thay đổi lệnh cp thành cp '{}' / tmp / xen / '{}' nhưng nó nói không có tệp hoặc thư mục như vậy. Có cách nào để tạo tập tin sao chép cp và tạo thư mục nếu cần không? Và hãy chỉ ra nếu chuỗi lệnh này có thể được đơn giản hóa. :-)

Cảm ơn sự phản hồi của bạn. Vì thư mục hơi lớn, tôi không muốn sao chép toàn bộ thư mục bằng cp -R hoặc rsync. Đề xuất của CK về việc sử dụng ống nhựa tar khá hữu ích.

svn status -q | awk '{ print $2 }' | xargs tar cf -  | (cd /tmp/xen/; tar xvf -)

Câu trả lời:


12

Vài suy nghĩ nhanh:

  • Thêm vào mkdir -p $ (FILE tên)
  • Bạn có thể sử dụng một ống nhựa tar để sắp xếp tất cả?

Biên tập

 tar -cf archive.tar  `svn status -q | awk '{print $2}'`

Nên tạo một kho lưu trữ các tập tin sửa đổi. Sau đó:

  tar -xf archive.tar -C /tmp/xen

nên đặt nó ở nơi bạn muốn Nếu nó cần phải ở một bước, điều đó cũng có thể.


4

rsync làm cho khá đơn giản, nó là công cụ tôi thường sử dụng để sao chép toàn bộ cấu trúc thư mục:

rsync -av /home/source/svn/repo /home/dest/svn/

Điều này sẽ tạo thư mục repo và tất cả nội dung trong thư mục / home / Dest / svn, vì vậy bạn sẽ có / home / Dest / svn / repo / ...

Vì vậy, ví dụ cho bạn:

rsync -rv ./ /tmp/xen/

-a, sẽ bảo tồn dấu thời gian và được đệ quy trong số những thứ khác, 'man rsync'.

Cập nhật sau khi nhận ra tôi đọc câu hỏi sai:

Để bắt chước cấu trúc thư mục (tar thay thế):

rsync -av --include='*/' --exclude='*' source destination

Và sau đó sao chép các tập tin trước khi nói 20 phút trước:

find . -type f -mmin -20 -print0 | xargs -0 cp --target-directory /mydestdir/

Đó là một điều hiển nhiên, nhưng điều đó sẽ đồng bộ hóa mọi thứ, không chỉ các tệp đã sửa đổi, phải không?
CK.

Rất tiếc, đã bỏ lỡ điều đó
Kyle Brandt

2

Đây là một lớp lót để tham khảo:

svn status -q | awk '{print $2}' | xargs tar -c | tar -xC /tmp/xen

Và bằng tiếng Anh:

  • lấy danh sách các tập tin quan tâm svn status -q, được dẫn vào ...
  • awk mà trích xuất cột với filepaths: awk '{print $2}'
  • xargs được sử dụng để cung cấp danh sách các tệp cho tar, do đó sẽ gửi một tarball của các tệp tới thiết bị xuất chuẩn: xargs tar -c
  • được trích xuất lại ngay lập tức ( -x) vào thư mục đích ( -C path):tar -xC /tmp/xen

1

Sử dụng "dirname" để trích xuất đường dẫn "mkdir -p" để tạo nó, đại loại như:

xargs -d \\n -l '{}' mkdir -p \`dirname '{}'\` && cp '{}' /tmp/xen/

1

rsync -a không tạo thư mục mới sâu hơn độ sâu 1, vì vậy rsync chỉ là giải pháp một phần và ví dụ không phù hợp với tôi (tôi đã tìm được câu trả lời làm thế nào để rsync thư mục đến một số phân cấp từ xa khi thiếu một số thư mục ở giữa )

Chỉnh sửa: Ý tôi là, tôi có thư mục nguồn: /home/user/projects/homework/1/1.1/ Và tôi muốn rsync nó từ xa: /home/user/projects/homework/1/1.1/ ... nhưng đích chưa có thư mục / home / user / dự án / bài tập về nhà ... và tôi không muốn chuyển các thư mục con khác trong máy nguồn đang ở / home / user / dự án /

Edit2: Tìm thấy một cách, với tùy chọn rsync --relative: Ví dụ trên sẽ như sau:

cd / nhà / dự án /; rsync -aR bài tập về nhà / 1 / 1.1 người dùng @ từ xa: / home / user / dự án /


0

Tôi muốn đề xuất như sau:

  • sao chép mọi thứ
  • tìm các tệp chưa sửa đổi và xóa các tệp đó, để lại các tệp đã sửa đổi ở vị trí của chúng.

Nhân tiện, cp với cờ R sao chép các tệp / thư mục theo cách đệ quy.

cp -R

0
  • xây dựng cấu trúc thư mục vào /tmp/f2cho các tập tin trong/tmp/f

    $ cd /tmp/f/
    $ find . -type f -exec dirname {} \; | uniq | xargs -I {} mkdir /tmp/f2/{} -p
    
  • sao chép tập tin vào định mệnh mới /tmp/f2/

    $ cd /tmp/f
    $ find . -type f -exec cp  {}  /tmp/f2/{} -aPv \;
    
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.