Tìm tệp mới hơn một ngày và sao chép


12

Tôi đang làm việc với một tập lệnh sẽ sao chép các tệp CHỈ đã được tạo trong ngày cuối cùng vào một thư mục khác. Vấn đề tôi gặp phải là tập lệnh tôi có các bản sao tất cả các tệp trong thư mục nguồn thay vì chỉ các tệp chưa đầy một ngày.

Đây là những gì tôi có:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

Đoạn mã trên sao chép tất cả các tệp trong thư mục nguồn. Nếu tôi xóa tất cả các đối số cho 'cp' thì nó hoạt động:

find . -mtime -1 -exec cp "{}" /somefolder \;

Đoạn mã trên chỉ sao chép các tệp mới nhất mà tôi muốn nhưng tôi cần giữ nguyên các thuộc tính bằng cách sử dụng các đối số cp.

Tôi cũng đã thử các biến và cho các vòng lặp nghĩ rằng có lẽ tùy chọn -exec là vấn đề:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

Tuy nhiên, ở trên cho kết quả vòng lặp trong cùng một vấn đề, tất cả các tệp được sao chép. Nếu tôi lặp lại các tệp $ chỉ các tệp tôi cần được hiển thị.

Làm thế nào tôi có thể làm điều này để làm việc?


1
Ok tôi nghĩ rằng tôi có nó hoạt động bằng cách sử dụng:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

Sẽ không rsync là công cụ tốt hơn cho nhiệm vụ này thay vì cp? rsync - một điểm đến nguồn
Darryl

Câu trả lời:


9

Một số triển khai cpcó một -ttùy chọn, vì vậy bạn có thể đặt thư mục đích trước các tệp:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

Lưu ý rằng -angụ ý --preservevì vậy tôi loại bỏ cái sau.


3

Bạn có thể sử dụng paxcho việc này như:

pax -wrT "11$(date +%H%M)," . /destination/folder

Dòng lệnh từng bit một:

  • -wr- khi paxđược trao cả hai tùy chọn -wnghi thức và -read nó sao chép. Có thể cũng hữu ích ở đây. (nhưng không bao gồm trong lệnh trên)

    • -link - tạo ra các liên kết cứng nếu có thể thay vì sao chép dữ liệu tệp.

    • -Xđể giới hạn paxtrong cùng một thiết bị nguồn và / hoặc hệ thống tập tin.

    • -s/src regex/replace/ - điều chỉnh tên tệp trong luồng

    • -verbose - để báo cáo về các tập tin có nguồn gốc / nhắm mục tiêu.

  • -T- -Ttùy chọn ime chọn các tệp cho kho lưu trữ đích (hoặc chỉ để sao chép khi được sử dụng -wr) dựa trên thời gian /mthay thế hoặc inode của /cchúng (hoặc cả hai) . Nó mặc định thời gian mod. Từ...

người đàn ông

  • ... So sánh thời gian bằng cả hai thời gian tệp là hữu ích khi pax được sử dụng để tạo lưu trữ gia tăng dựa trên thời gian (chỉ các tệp được thay đổi trong phạm vi thời gian được chỉ định sẽ được lưu trữ).

  • Một phạm vi thời gian được tạo thành từ sáu trường khác nhau và mỗi trường phải chứa hai chữ số. Định dạng là:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • Trong trường hợp cclà hai chữ số đầu tiên của năm (thế kỷ), yylà hai chữ số cuối cùng của năm, người đầu tiên mmlà tháng (01-12), ddlà ngày của tháng (01-31), HHlà giờ trong ngày (từ 00 đến 23), MMlà phút (từ 00 đến 59) và SSlà giây (từ 00 đến 59). Trường phút MMlà bắt buộc, trong khi các trường khác là tùy chọn và phải được thêm theo thứ tự sau:

    HH, dd, mm, yy, cc

  • Các SSlĩnh vực có thể được bổ sung một cách độc lập của các lĩnh vực khác. Phạm vi thời gian liên quan đến thời gian hiện tại, vì vậy ...

    -T 1234/cm

  • ... sẽ chọn tất cả các tệp có thời gian thay đổi hoặc thay đổi inode là 12:34 PM hôm nay hoặc sau đó.

  • Nhiều -Tphạm vi thời gian có thể được cung cấp và kiểm tra các điểm dừng với trận đấu đầu tiên.

... Vì vậy, 11lệnh trong ví dụ của tôi có liên quan đến ngày hôm nay - nó ít hơn một ngày so với ngày hôm nay - thứ mười hai - và phần còn lại chỉ là một "$(date)"định dạng chuẩn theo sau là dấu phẩy.

... ngoại trừ - và điều cuối cùng đáng nói - tôi sử dụng một đường dẫn tuyệt đối cho thư mục đích - và bạn cũng nên làm như vậy nếu bạn làm điều đó. Tất cả các tài liệu đều tham chiếu hành vi không xác định cho các đường đích tương đối - và lần đầu tiên tôi thử sử dụng, paxtôi đã chửi thề trong một tiếng đồng hồ trong sự nhầm lẫn với tất cả các kết quả kỳ lạ cho đến khi tôi sử dụng một đường dẫn tuyệt đối.


2

Cảm ơn mọi người đã giúp đỡ, giúp nó hoạt động bằng cách sử dụng kết hợp các đề xuất của bạn:

đã đi với mã dưới đây và nó hoạt động hoàn hảo.

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

cảm ơn lần nữa


2

Tôi đã làm chính xác chức năng tương tự nhưng cần thiết để bảo vệ cấu trúc thư mục. Do đó những gì tôi đã làm là một chút khác nhau.

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

trong đó $ days là số ngày $ tarpath là đường dẫn tạm thời để lưu trữ các tệp này. và khi tôi muốn khôi phục.

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

Điều đó đã thực hiện các mẹo cho tôi.

Lưu ý: nếu bạn muốn loại trừ một số thư mục trong khi sao lưu, bạn có thể sử dụng lệnh sau

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

Ưu điểm: 1. Tôi luôn có một bản sao của những gì tôi đã khôi phục lần trước ở định dạng nén.

  1. Ngoài ra, tôi có một khoảng dừng giữa các lần khôi phục nơi tôi có thể đến và kiểm tra các tệp đó là gì và nếu tất cả đều ổn thì hãy tiếp tục với tập lệnh.

  2. Nó bảo tồn cấu trúc thư mục do đó nó chỉ ghi đè các tệp đã sửa đổi từ thư mục nguồn vào thư mục đích

Lưu ý: Mặt khác, nếu yêu cầu không giới hạn trong ngày, tôi sẽ sử dụng rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

thêm cho rsyc với ngày ở đây


1

Người ta cũng có thể chọn ngày và thời gian chính xác ngoài việc quay lại một số ngày nhất định

(Điều này chỉ hoạt động tốt trong trường hợp tên tệp của bạn không có bất kỳ khoảng trắng, tab hoặc ký tự đại diện nào trong đó)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

Trên đây sao chép tất cả các tệp trong thư mục đã được tạo sau ngày 17 tháng 12 năm 2016 20:10:00 tới FOLDER (1 ngày trước ngày hôm nay :)

Hãy cẩn thận với biểu tượng cho lệnh find, nó KHÔNG phải là cái này: 'nó là cái này, một backtick: `lựa chọn ngày với cái này:'

Đối với các tệp có dấu cách, tab, dòng mới hoặc ký tự đại diện trong tên của chúng, bạn có thể sử dụng một trong các giải pháp từ Stéphane Chazelas, đầu tiên là cho GNU, thứ hai là cho GNU hoặc một số BSD:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


Cảm ơn Stephane, đó có thể là lý do tại sao tôi không thể tìm thấy điều này trong bất kỳ bài đăng nào, mặc dù đối với trường hợp của tôi, nó hoạt động như một cơ duyên. khi bạn làm điều này chỉ tìm thấy. -type f -newermt '17 tháng 12 năm 2016 20:10:00 '
FatihSarigol

... Nó in các tệp được tạo sau thời gian đó, tôi không chắc nó có thể gây ra vấn đề gì. sau đó tôi chỉ sử dụng backticks để chọn những tập tin này sẽ được sao chép. chúc mừng
FatihSarigol

Tôi tin rằng bài đăng bạn chia sẻ là về "Vòng lặp", mã của tôi có lặp lại kết quả tìm thấy không? hoặc chỉ là chọn kết quả của find để được sử dụng bởi bản sao? (Xin lỗi vì 3 bình luận, tôi dường như không được phép chỉnh sửa bình luận của mình
FatihSarigol

1
Sử dụng find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) hoặc find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU hoặc một số BSD (tính di động của yếu tố giới hạn wrt là -newermtvị ngữ ở đây)).
Stéphane Chazelas
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.