Shell Script - Nhận tất cả các tệp được sửa đổi sau <ngày>


136

Tôi thà không làm điều này trong PHP vì vậy tôi hy vọng ai đó giỏi về kịch bản shell có thể giúp đỡ.

Tôi cần một tập lệnh chạy qua thư mục theo cách đệ quy và thấy tất cả các tệp có ngày sửa đổi cuối cùng lớn hơn một số ngày. Sau đó, nó sẽ tar và zip (các) tệp giữ thông tin đường dẫn.


14
Quyết định tốt để không làm điều đó trong PHP.
Kredns

1
Bạn có thể sử dụng bất kỳ ngôn ngữ kịch bản shell nào, ví dụ python, ruby, perl mà không cần dùng đến php.
garrow

3
@garrow Điều này thực sự sẽ khá đơn giản trong PHP khi sử dụng RecursiveDirctoryIterator được mã hóa trong FilterIterator.
Artefacto

Câu trả lời:


136

đơn giản như:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

nơi find . -mtime -1sẽ chọn tất cả các tệp trong thư mục hiện tại (đệ quy) được sửa đổi ngày hôm trước. bạn có thể sử dụng phân số, ví dụ:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz

4
Xem câu trả lời của user104848 bên dưới để biết cách xử lý khoảng trắng trong tên tệp của bạn
Brian Henk

8
Chuyển đổi dấu thời gian tùy ý thành phân đoạn thời gian tương đối có vẻ không chính xác cũng không đặc biệt thuận tiện. Các giải pháp dưới đây sử dụng -newermtlà đẹp hơn nhiều .
Bobby Jack

5
Khi cố gắng trích xuất bất kỳ tệp nào có thay đổi trong cấu trúc với các thư mục, chính các thư mục được đánh dấu sửa đổi khiến toàn bộ thư mục được lưu trữ. Thêm -type fvào chỉ chọn tập tin. Điều này duy trì cấu trúc thư mục, nhưng chỉ sao lưu các tệp có thay đổi.
Brent

1
@BrianHenk user104848 thay đổi tên của họ, tôi khá chắc chắn rằng bạn có nghĩa là câu trả lời này từ (hiện tại) Jason Luther
icc97

4
Câu hỏi yêu cầu tìm tệp vào một ngày tùy ý. Câu trả lời này là làm thế nào để tìm các tập tin theo số ngày tùy ý trong quá khứ. Tôi không nghĩ rằng đây sẽ là câu trả lời được chấp nhận mà không cần thêm một bước để chuyển đổi ngày thành đồng bằng ngày.
Đánh dấu

91

Nếu bạn có GNU find, thì có một nhóm các tùy chọn liên quan. Điều khó khăn duy nhất là giao diện với chúng ít hơn sao:

  • -mmin n (thời gian sửa đổi trong vài phút)
  • -mtime n (thời gian sửa đổi trong ngày)
  • -newer file (thời gian sửa đổi mới hơn thời gian sửa đổi của tệp)
  • -daystart (điều chỉnh thời gian bắt đầu từ thời điểm hiện tại đến đầu ngày)
  • Cộng với các lựa chọn thay thế cho thời gian truy cập và 'thay đổi' hoặc 'tạo' thời gian.

Phần khó là xác định số phút kể từ một thời điểm.

Một lựa chọn đáng để xem xét: sử dụng touchđể tạo một tệp có dấu thời gian sửa đổi cần thiết; sau đó sử dụng findvới -newer.

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

Điều này tìm kiếm các tệp mới hơn 2009-01-03T12: 31: 43. Rõ ràng, trong một tập lệnh, /tmp/wotsitsẽ là một tên với PID hoặc giá trị khác để làm cho nó là duy nhất; và sẽ có một trapđể đảm bảo nó được gỡ bỏ ngay cả khi người dùng bị gián đoạn, vân vân và vân vân.


65
Thay vào đó, bạn có thể sử dụng -newermt '2009-01-03T12:31:43'để tránh phải tạo một tệp chỉ để tham khảo.
Michael Mior

@MichaelMior: Thú vị - 'tìm thấy' trên các hỗ trợ MacOS X 10.7.2 -newermt(được ghi lại dưới đây -newerXYvì có nhiều tùy chọn; X = m, Y = t trong trường hợp này). GNU tìm thấy trên các hệ thống Linux (gần như cổ xưa) mà tôi sử dụng không hỗ trợ các tùy chọn, vì vậy đây là một sự xuất hiện tương đối gần đây. Cảm ơn cho những người đứng đầu lên.
Jonathan Leffler

Tùy chọn này có trong GNU find 4.4.2 mà tôi đang sử dụng trên hệ thống của mình.
Michael Mior

2
Cũng lưu ý rằng GNU find cũng hỗ trợ thời gian tương đối. -newermt '-2 weeks'.
Cybolic

1
-newermt '2009-01-03T12:31:43'Trông thật tuyệt, nhưng thật đáng buồn là dường như diễn giải mọi thứ trong múi giờ sai: list.gnu.org/archive/html/orms-findutils/2012-12/msg00009.html
antoine

35

Bạn có thể làm điều này trực tiếp với tar và thậm chí tốt hơn:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

Điều này hướng dẫn tar nén các tệp mới hơn ngày 1 tháng 1 năm 2014, 18:00:00.


9
Huh ... Tôi đã sử dụng Unix từ năm 1984 và chưa bao giờ biết điều này. Luôn luôn một cái gì đó để học hỏi.
John

Việc triển khai tarđi kèm với OS X và FreeBSD chỉ hỗ trợ --newerlà tùy chọn dài cho -NGNU tar.
nisetama

Điều này thật tuyệt vời ... Tôi chỉ có thể làm cho nó hoạt động với bzip, không sử dụng -xcvf và phần mở rộng gz ... nhưng tôi không phải là chuyên gia.
phil

17

Điều này sẽ làm việc cho một số lượng các tập tin. Bạn muốn bao gồm "-print0" và "xargs -0" trong trường hợp bất kỳ đường dẫn nào có khoảng trắng trong đó. Ví dụ này tìm kiếm các tệp được sửa đổi trong 7 ngày qua. Để tìm những người được sửa đổi trước 7 ngày qua, hãy sử dụng "+7".

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

trang này cảnh báo, xargs có thể khiến lệnh tar được thực thi nhiều lần nếu có nhiều đối số và cờ "-c" có thể gây ra sự cố. Trong trường hợp đó, bạn sẽ muốn điều này:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

Bạn không thể cập nhật kho lưu trữ tar được nén bằng tar, vì vậy bạn sẽ phải bzip2 hoặc gzip nó trong bước thứ hai.


1
Về điểm thứ hai, bạn cũng có thể sử dụng lệnh tar kích hoạt gzip, như tùy chọn -z của Gnu tar, để cập nhật lưu trữ được nén.
Suncat2000

Hoặc thêm tùy chọn 'j' để sử dụng bzip trong các tệp GNU gần đây
hd1

3
Như tôi đã nói ở trên về câu trả lời của Jonathan, điều này sẽ lấy các thư mục có thay đổi khiến tất cả các tệp của chúng được nhập. Thêm -type fvào chỉ chọn tập tin. Điều này duy trì cấu trúc thư mục, nhưng chỉ sao lưu các tệp có thay đổi / được thêm gần đây.
Brent

12

Điều này sẽ hiển thị tất cả các tập tin sửa đổi trong vòng 7 ngày qua.

find . -type f -mtime -7 -print

Ống mà vào tar / zip, và bạn nên được tốt.


3

cũng dưới linux hãy thử đọc trang man của lệnh find

man find

một cái gì đó như thế này nên

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

và bạn có nó


3

Bạn có thể nhận danh sách các tệp được sửa đổi lần cuối muộn hơn x ngày trước với:

find . -mtime -x

Sau đó, bạn chỉ cần tập tin tar và zip trong danh sách kết quả, ví dụ:

tar czvf mytarfile.tgz `find . -mtime -30`

cho tất cả các tập tin được sửa đổi trong tháng trước.


3
"-Mtime x" khớp với các tệp được sửa đổi chính xác "x" ngày trước, sử dụng "-mtime -x" để khớp với các tệp được sửa đổi ít hơn "x" ngày trước.
Lance Richardson

3

Tôi chỉ đơn giản là làm như sau để sao lưu tất cả các tệp mới từ 7 ngày trước

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

lưu ý bạn cũng có thể thay thế '7 ngày trước' bằng bất cứ điều gì phù hợp với nhu cầu của bạn

Có thể : date -d'yesterday' +"%d-%b"

Hoặc thậm chí: date -d'first Sunday last month' +"%d-%b"


2

Tập lệnh này sẽ tìm thấy các tệp có ngày sửa đổi là hai phút trước và sau ngày đã cho (và bạn có thể thay đổi các giá trị trong các điều kiện theo yêu cầu của bạn)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

Ví dụ bạn muốn tập tin có ngày sửa đổi trước ngày đưa ra chỉ, bạn có thể thay đổi 120để 0trong $DIFF_IN_DATEtham số loại bỏ các điều kiện của $DIFF_IN_DATE1tham số.

Tương tự, nếu bạn muốn tập tin có ngày sửa đổi 1 giờ trước và sau ngày nào đó, chỉ cần thay thế 120bởi 3600trong if CONDITION.

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.