Làm thế nào để kiểm tra tập tin nào sẽ được sao chép bằng lệnh cp?


11

Tôi đang tạo một tập lệnh đơn giản sao chép tất cả các tệp từ DIRECTORYA không tồn tại trong DIRECTORYB. Tôi đang làm điều này thông qua việc sử dụng lệnh cp:

cp -u DIRECTORYA/* DIRECTORYB

Những gì tôi muốn làm cũng là gửi email đến quản trị viên sẽ liệt kê các tệp đã được sao chép.

Rất lý tưởng, trước khi tôi chạy lệnh trên, tôi muốn lấy các tệp sẽ được sao chép và lưu trữ chúng trong một biến để sử dụng sau này khi xây dựng thông điệp email của tôi.

Ai đó có thể chỉ cho tôi phương hướng đúng không? Tôi đã xem xét việc sử dụng grep nhưng tôi không nghĩ rằng điều này có thể được thực hiện bằng lệnh cp?


1
Có thể tôi đang hiểu nhầm câu hỏi của bạn, nhưng bạn không thể sử dụng -vcờ, để in tên tệp khi chúng được sao chép? Chuyển hướng đó đến một tệp hoặc trực tiếp trong một biến và sử dụng nó để xây dựng thông điệp của bạn.
ThibautRenaux 3/03/2015

Ngoài ra, cplệnh có tùy chọn --attributes-onlycho phép không sao chép dữ liệu tệp, mà chỉ cấu trúc thư mục và tệp.
Costas

Xin lỗi tôi khá mới với kịch bản. Nếu tôi sử dụng cờ -v, làm thế nào tôi có thể xuất ra một biến thay vì một tệp?
James

1
Giả sử bạn đang sử dụng bash, variable=$(cp -v ...)ghi lại thiết bị xuất chuẩn của cp. Xem gnu.org/software/bash/manual/html_node/Command-Substlation.htmlm
Gowtham 3/03/2015

Câu trả lời:


4

Tôi không nghĩ GNU cpcó bất cứ điều gì để giúp bạn nếu bạn muốn xem nó sẽ làm gì mà không hành động. Nếu bạn muốn đăng nhập các tệp đã được sửa đổi, bạn có thể sử dụng -vtùy chọn:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Thay vì cp, bạn có thể sử dụng rsync , mạnh hơn rất nhiều và được cài đặt ở hầu hết mọi nơi trừ các hệ thống nhúng cấp thấp (và dễ dàng cài đặt ở nơi không có mặc định).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

hoặc là

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

2

Nếu bạn muốn chạy cp foo*bar whatever, sau đó chạy echo foo*bar whatever.


Nhưng OP muốn chạy cp -uvà anh ấy đang tìm kiếm một tùy chọn chạy khô cho cp.
Arkadiusz Drabchot 3/03/2015

2

Theo trang hướng dẫn ,

-u, chỉ sao chép khi tệp SOURCE mới hơn tệp đích hoặc khi tệp đích bị thiếu--update

đây là một tính năng kết hợp hai thử nghiệm, một thử nghiệm nhỏ để thực hiện trong một tập lệnh ( thiếu ) và một yêu cầu một số công việc ( mới hơn ). Bạn có thể làm cho một kịch bản mà báo cáo những gì cần thiết sử dụng comm, difftest.

Không có cptiện ích tiêu chuẩn nào cung cấp khả năng chạy khô hoạt động sao chép. Theo đề xuất, rsynclà cách để làm điều này với một tiện ích thường có sẵn. Tất nhiên, rsyncthường được sử dụng để sao chép dựa trên nhiều tiêu chí hơn là chỉ mới hơn hoặc thiếu (kích thước tệp và dấu thời gian cũng được sử dụng). Nhưng nó có thể được giảm xuống để làm chỉ cp -u.

Đối với các tiện ích không chuẩn, có copytiện ích mà tôi đã viết (và tất nhiên vẫn sử dụng) vào cuối những năm 1980. Nó có lẽ được lấy cảm hứng từ maketiện ích, vì tùy chọn đầu tiên tôi thêm vào là -n.

Đối với ví dụ đã cho, nó sẽ được sử dụng như thế này:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Đọc thêm:

  • sao chép - tập tin / thư mục tiện ích sao chép

    -n vô hiệu hóa việc tạo hoặc sửa đổi thực tế của các tệp và (tùy thuộc vào mức độ chi tiết) cho thấy hiệu ứng mà copy lệnh sẽ có.
    -u chỉ sao chép tệp nếu kích thước hoặc ngày sửa đổi của chúng khác nhau và chỉ liên kết nếu văn bản liên kết khác.
    -U chỉ sao chép các tệp mới hơn đích hoặc không tồn tại ở đích.

  • thay đổi mục nhập từ tháng 8 năm 1988 :

    1988-08-16    
            * src / copy / src / copy.c: đã thêm tùy chọn "-d" và "-n".
    

0

Bạn có thể sử dụng lệnh diff. Tôi có một công việc sao chép một số tập tin sao lưu hàng ngày. đôi khi tôi cần kiểm tra xem tất cả các tệp có được sao chép không, đây là cú pháp:

diff /file1/ /file2/

và tất nhiên nếu bạn muốn sao chép chúng, hãy sử dụng:

cp -u /file1/* /file2

0

Thay vào đó hãy xem xét sử dụng rsync. Rsync hoạt động hoàn toàn tốt trên các bản sao địa phương và chắc chắn có thể làm những gì bạn muốn, một khi bạn lội qua mười lăm tùy chọn mà nó có.

rsync -avun DIRECTORYA/ DIRECTORYB

sẽ cho bạn thấy mọi thứ sẽ được thực hiện, và

rsync -avu DIRECTORYA/ DIRECTORYB

sẽ làm điều đó.

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.